在节点模块名称中使用@符号

Der*_*nni 84 javascript node.js chef-infra npm

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

var restServer = require('@company/config')
Run Code Online (Sandbox Code Playgroud)

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

Error: Cannot find module '@company/config'

我坦率地预计,在我的目录中没有任何东西看起来像需要识别!看起来这里有一些魔法,我讨厌.

我可以猜到的是,这是一些我没有接触到的一些模糊的npm或Node技巧,或者可能是我没有得到的其他一些黑暗的配置艺术.任何信息都会受到赞赏,即使这只是对@需要如何工作的解释.

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

更新: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.
Run Code Online (Sandbox Code Playgroud)

vae*_*r-k 50

npm中的范围包裹前面有一个"@"符号:https://docs.npmjs.com/misc/scope

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

需要范围包

由于范围包安装在范围文件夹中,因此在代码中需要时,必须包括范围的名称,例如

require('@myorg/mypackage')
Run Code Online (Sandbox Code Playgroud)

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


Der*_*nni 14

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

原来@company/config是我们的私有NPM存储库之一,托管在npm上,并由此别名定义为内部GitHub存储库:它与require工作方式无关.

使用@可能或可能不是我不知道私有NPM回购的协议,如果你遇到这个,请记住这一点.


Cir*_*四事件 11

@范围是指包所有权

官方文档位于:https : //docs.npmjs.com/about-scopes

注册npm用户帐户或创建组织时,系统会授予与您的用户或组织名称匹配的范围。您可以将此作用域用作相关程序包的命名空间。

范围允许您创建与其他用户或组织创建的包同名的包,而不会发生冲突。

到目前为止,我所看到的范围的主要优点是每个范围都由组织/用户的npm帐户控制,就像GitHub用户名/组织名称一样。

这样,可以轻松确定正在查看的程序包是否属于您信任的组织,或者它是否是第三方工具。

例如,如果您看到一个包装:

@angular/cli
Run Code Online (Sandbox Code Playgroud)

那么您就会知道它来自控制Angular团队的用户/组,并且可以信任。

另一方面,不能这样说:

angular-cli
Run Code Online (Sandbox Code Playgroud)

TODO:网页UI / URL方案确实是靠不住的,你怎么轻易链接:https://www.npmjs.com/package/@angular/cli到相应的组织/用户页面,想必HTTPS://www.npmjs .com /〜angular吗?通过搜索页面源,该URL的唯一匹配项位于“合作者”下,但其中还包含其他合作者:https : //www.npmjs.com/~angular-clihttps://www.npmjs.com /〜google-wombot

另请参阅:npm软件包上的“ at”(@)前缀是什么意思?


Pra*_*ari 7

除了作用域包外,“ @”可能是由于npm中的模块别名包引起的。通过模块别名,您可以使用常用模块,而无需使用其完整路径。当目录结构很长时,它也有效。例如)require('../../../../some/very/deep/module')

相反,您可以使用: var module = require('@deep/module')

在package.json中,您可以提供要为其提供别名的模块:

"_moduleAliases": {
  "@root"      : ".", // Application's root
  "@deep"      : "src/some/very/deep/directory/or/file",
  "@my_module" : "lib/some-file.js",
  "something"  : "src/foo", // Or without @. Actually, it could be any string
}
Run Code Online (Sandbox Code Playgroud)

在应用程序的主文件中使用以下命令:

require('module-alias/register');
Run Code Online (Sandbox Code Playgroud)

请参阅此处以获取详细信息:module-alias


小智 6

当您调用require()它时,它会读取一条路线。由于将文件夹命名为 似乎没有问题@company,因此您应该能够要求带有@.

您的同事可能希望@company/config.js为自己保留,因为配置通常是个人的,对于其他用户来说不可能相同。

require 将调用项目文件夹中的文件,详细信息:

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

@company/config在我的测试项目文件夹中创建了一个路由。它只允许我使用./@company/config. 只有当我将文件夹移到里面时node_modules,它才允许我require('@company/config');

我不建议在里面放任何模块node_modules,它只是一个npm包的“容器” 。尝试创建一个新的配置文件并更改 require 路由,或者简单地删除 require 并在主文件中创建一个配置对象。