在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对象。