在Node模块名称中使用@符号

我正在看同事写的一些代码,她在require语句中使用了@符号。 这是这些文件中的第一行:

 var restServer = require('@company/config') 

当我尝试运行此代码时,出现错误:

Error: Cannot find module '@company/config'

我坦率地期望,在我的目录中没有任何东西看起来像需要识别! 这似乎有一些魔术在这里,我讨厌。

我所能猜到的是,这是一个晦涩难懂的npm或Node trick,我还没有看到,也许还有一些其他的黑暗configuration艺术,我没有得到。 任何信息赞赏,即使这只是解释如何@与需求。

其他的想法:厨师是在这个整个事情的某个地方,所以这可能是相关的。

更新 :99%肯定这是npm config在这一点上的工作方式的一个问题,但仍然不知道如何去解决它。

Update2基于我发现的一些东西:

 Dereks-MacBook-Pro:project-dir derekjanni$ npm config set //registry.npmjs.org/:authtoken $SECRET_TOKEN Dereks-MacBook-Pro:project-dir derekjanni$ npm install npm ERR! Darwin 15.0.0 npm ERR! argv "/usr/local/Cellar/node/5.5.0/bin/node" "/usr/local/bin/npm" "install" npm ERR! node v5.5.0 npm ERR! npm v3.5.3 npm ERR! code E404 npm ERR! 404 Not found : @company/config npm ERR! 404 '@company/config' is not in the npm registry. 

npm中的作用域包以“@”符号开头: https : //docs.npmjs.com/misc/scope

文档包含有关需要有限定范围的软件包的其他信息: https : //docs.npmjs.com/misc/scope#requiring-scoped-packages

要求范围的软件包

因为有作用域的包被安装到一个作用域文件夹中,所以你需要在你的代码中包含这个作用域的名字,例如

 require('@myorg/mypackage') 

Node对待范围文件夹的方式没有什么特别之处,只是指定在名为@myorg的文件夹中需要模块mypackage。

所以我自己解决了这个问题

原来, @company/config是我们的私人NPM仓库之一,托pipe在npm上,并通过这个别名定义到一个内部的GitHub仓库:它与require工作方式没有任何关系。

使用@可能会或可能不是一个协议,我不知道私人NPM回购,请记住,如果你碰到这一点。

当你调用require()它读取一个路由。 由于如果将文件夹命名为@company ,似乎没有任何问题,您应该可以使用@来请求某些内容。

你的同事可能已经想为自己保留@company/config.js ,因为configuration通常是个人的,而且对于另一个用户来说不可能是一样的。

require会调用你的项目文件夹中的文件,并提供一个细节:

  • 如果您在项目文件夹中调用文件,则必须在路由前添加./
  • 如果您调用任何全局程序包(如http或任何npm模块(安装在node_modules )),则可以省略./

我在我的testing项目文件夹里创build了一个route @company/config 。 它只允许我使用./@company/config 。 只有当我移动node_modules内的文件夹,它允许我require('@company/config');

我不推荐在node_modules放置任何模块,它只是npm包的一个“容器”。 尝试创build一个新的configuration文件并更改require路由,或者直接删除require,然后在主文件中创build一个configuration对象。