在Angular组件路由器文档中,我无意中发现了一个我从未见过的npm命令,我不明白这是怎么回事:
npm install @angular/router --save
@angular/router是什么意思?
整个字符串是包名吗?但是当我在npmjs.com上搜索时,我没有找到那个包裹。
而且命令行搜索也不会返回这样的包:
npm search @angular/router
:No match found for "@angular/router"
@angular/是npm中的某种前缀机制吗?它是如何工作的呢?
这是NPM的一个新特性,称为“作用域包”,它有效地允许NPM包被命名空间化。NPM上的每个用户和组织都有自己的作用域,而且他们是唯一可以向其中添加包的人。
这很有用,原因如下:
它允许组织明确哪些包是“官方的”,哪些不是。
例如,如果一个包的作用域是@angular,你就知道它是由Angular核心团队发布的。
包名只需要对发布它的作用域惟一,而不是对整个注册中心惟一。
例如,包名http已经在主存储库中使用了,但Angular也可以使用@angular/http。
有作用域的包没有出现在公共搜索中的原因是,其中很多都是由使用NPM付费服务的组织创建的私有包,他们不愿意打开搜索,直到他们完全确定他们不会公开任何不应该公开的东西——从法律的角度来看,这是可以理解的。
要了解更多信息,请参阅NPM文档和Angular文档。
编辑:看来公共作用域包现在显示正确的搜索!
基本上npm上有两种类型的模块,它们是-
Global modules - these are modules that follow the naming convention that exists today. You require('foo') and there is much rejoicing. They are owned by one or more people through the npm install XYZ command.
Scoped modules - these are new modules that are "scoped" under an organization name that begins with an @ the organisation's name, a slash and finally the package name, e.g. @someOrgScope/packagename. Scopes are a way of grouping related packages together, and also affect a few things about the way npm treats the package.
在npm install中,通过名称(前面加@-符号)引用包来安装作用域包:
npm install @myorg/mypackage
另请参阅
http://blog.nodejitsu.com/a-summary-of-scoped-modules-in-npm/
https://docs.npmjs.com/misc/scope
@根据它在NPM包名称中的位置有不同的含义。
一个包是:
包含由包描述的程序的文件夹。json文件。
包含(1)的压缩tarball。
解析为(2)的url。
与(3)一起发布在注册表上的<名称>@<版本>。
指向(4)的<name>@<标记>。
具有" latest "标记的<name>满足(5)。
解析为(1)的<git远程url>。
NPM安装[<@scope>/]<name> .
<scope>是可选的。包将从与指定范围关联的注册中心下载。如果没有与给定范围相关联的注册表,则假定默认注册表。
注意:如果你的作用域名称中没有包含@-符号,npm会将其解释为GitHub存储库,如下所示。作用域名称后面也必须跟一个斜杠。
NPM安装[<@scope>/]<name>@<tag> .
安装由指定标记引用的包的版本。如果该标记不存在于该包的注册表数据中,则此操作将失败。
例子:
npm install packagename@latest
npm install @myorg/mypackage@latest
NPM安装[<@scope>/]<name>@<版本> .
安装指定版本的软件包。如果版本尚未发布到注册中心,则此操作将失败。
例子:
npm install packagename@0.1.1
npm install @myorg/privatepackage@1.5.0
NPM install [<@scope>/]<name>@<版本范围> .
安装与指定版本范围匹配的包的版本。
例子:
npm install packagename@">=0.1.0 <0.2.0"
npm install @myorg/privatepackage@">=0.1.0 <0.2.0"
什么是作用域模块。
所有的npm包都有一个名称,并且这些名称应该是唯一的。限定作用域的npm包遵循与其他npm包名称相同的规则(url安全字符,下划线或没有前导点)。当在包名中使用时,作用域前面加一个@符号,后面加一个斜杠/。
@somescope/somepackagename
npm作用域的模块通常将相关的npm包分组在一起。当你注册一个npm用户帐户或创建一个组织。每个npm用户/组织都有自己的作用域,只有他们和他们的员工可以在你的作用域中添加包。通常授予您一个与您的用户或组织名称匹配的范围。您可以使用此作用域作为相关包的名称空间。
作为一个npm用户,你不必担心别人在你之前取你的包名。因此,使用作用域模块也是组织npm包的好方法。
使用作用域包的优点:
作用域包允许组织管理私有包。
Scoped包的名称只需要对发布它的作用域惟一,而不是对整个npm注册表惟一。
通常,组织选择保持他们的作用域包私有,并且由于各种原因他们不会出现在公共搜索中。