在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/
某种前缀机制是什么?它是如何工作的?
答案 0 :(得分:170)
这是NPM的一个新功能,称为“范围包”,它有效地允许NPM包被命名空间。 NPM上的每个用户和组织都有自己的范围,他们是唯一可以向其添加包的人。
这有几个原因:
@angular
,则您知道它是由Angular核心团队发布的。http
已在主存储库中获取,但Angular也可以拥有@angular/http
。scoped packages don't show up in public search的原因是因为其中很多是使用NPM付费服务的组织创建的私有包,他们不习惯开放搜索,直到他们完全确定他们不会去公开任何不公开的内容 - 从法律角度来看,这是可以理解的。
有关详细信息,请参阅NPM docs和Angular docs。
答案 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"