" at"是什么意思? npm包上的(@)前缀?

时间:2016-04-16 17:18:54

标签: javascript angular npm

Angular Component Router documentation我偶然发现了一个我以前从未见过的命令,我不明白发生了什么:

npm install @angular/router --save

@angular/router是什么意思?

整个字符串是包名吗?但是当我在npmjs.com上使用搜索时,我找不到该包。 并且命令行搜索确实没有返回这样的包:

npm search @angular/router
:No match found for "@angular/router"

npm中的@angular/某种前缀机制是什么?它是如何工作的?

3 个答案:

答案 0 :(得分:170)

这是NPM的一个新功能,称为“范围包”,它有效地允许NPM包被命名空间。 NPM上的每个用户和组织都有自己的范围,他们是唯一可以向其添加包的人。

这有几个原因:

  • 它允许组织明确哪些包是“官方的”,哪些包不是。
    • 例如,如果某个包的范围为@angular,则您知道它是由Angular核心团队发布的。
  • 包名称只需对其发布的范围是唯一的,而不是整个注册表。
    • 例如,包名称http已在主存储库中获取,但Angular也可以拥有@angular/http

scoped packages don't show up in public search的原因是因为其中很多是使用NPM付费服务的组织创建的私有包,他们不习惯开放搜索,直到他们完全确定他们不会去公开任何不公开的内容 - 从法律角度来看,这是可以理解的。

有关详细信息,请参阅NPM docsAngular docs

编辑:看来public scoped packages now show up properly in search!

答案 1 :(得分:42)

基本上npm有两种类型的模块,它们是 -

  • 全局模块 - 这些模块遵循当前存在的命名约定。你require('foo')并且欢欣鼓舞。它们由一个或多个人通过npm install XYZ命令拥有。

  • Scoped模块 - 这些是在组织名称下“作用域”的新模块,该组织名称以组织名称的@开头,斜杠,最后是包名称,例如@someOrgScope/packagename。范围是一种将相关包分组在一起的方式,也会影响npm处理包的方式。

通过名称引用作用域软件包,在npm install中以@ -symbol开头:

npm install @myorg/mypackage

另见

答案 2 :(得分:1)

@根据其在npm软件包名称中的位置而具有不同的含义,即 一个包是: 一种)。包含package.json文件描述的程序的文件夹

b)。包含(a)的压缩tarball

c)。解析为(b)的网址

d)。一个@(c)在注册表中发布

e)。 @指向(d)

f)。带有满足(e)的“最新”标签的

g)。解析为(a)的A

npm install [<@scope> /] <名称>
<作用域> 是可选的。该包将从与指定范围关联的注册表中下载。如果没有注册表与给定范围相关联,则使用默认注册表

注意:如果您的作用域名称上未包含@-符号,则npm会将其解释为GitHub存储库,请参见下文。范围名称也必须后面加上斜杠。

npm install [<@scope> /] <名称> @ <标签>
安装指定标签引用的软件包的版本。如果该程序包的注册表数据中不存在该标记,则此操作将失败。 示例:

npm install packagename@latest
npm install @myorg/mypackage@latest

npm install [<@scope> /] <名称> @ <版本>
安装指定版本的软件包。如果该版本尚未发布到注册表,则将失败。 示例:

npm install packagename@0.1.1
npm install @myorg/privatepackage@1.5.0

npm install [<@scope> /] <名称> @ <版本范围>
安装与指定版本范围匹配的软件包版本。 示例:

npm install packagename@">=0.1.0 <0.2.0"
npm install @myorg/privatepackage@">=0.1.0 <0.2.0"