“;在“;npm包上的(@)前缀

What is the meaning of the "at" (@) prefix on npm packages?

本文关键字:前缀 npm      更新时间:2023-09-26

在Angular Component Router文档中,我偶然发现了一个从未见过的npm命令,我不明白发生了什么:

npm install @angular/router --save

@angular/router的含义是什么?

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

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

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

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

这是有用的几个原因:

  • 它允许组织明确哪些包是"官方的",哪些不是。
    • 例如,如果一个包的作用域为@angular,那么您就知道它是由Angular核心团队发布的
  • 包名称只需对其发布的作用域唯一,而不是对整个注册表唯一。
    • 例如,包名称http已经在主存储库中使用,但Angular也可以使用@angular/http

作用域包没有出现在公共搜索中的原因是,其中很多是由使用NPM付费服务的组织创建的私人包,在完全确定不会公开任何不应该公开的内容之前,他们不愿意打开搜索-从法律角度来看,这是可以理解的。

有关更多信息,请参阅NPM文档和Angular文档。

编辑:看来公共范围的包现在可以在搜索中正确显示了!

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

  • 全局模块-这些模块遵循当今存在的命名约定。你require('foo')和有很多欢乐。它们由一个或多个人员通过npm install XYZ命令拥有。

  • 作用域模块-这些是在组织名称下"作用域"的新模块,该名称以@(组织名称)、斜线开始,最后是包名称(例如@someOrgScope/packagename)。作用域是将相关包分组在一起的一种方式,也会影响npm处理包的方式。

在npm install:中,通过名称引用作用域软件包,并在其前面加上一个@符号来安装该程序包

npm install @myorg/mypackage

另请参见

  • http://blog.nodejitsu.com/a-summary-of-scoped-modules-in-npm/

  • https://docs.npmjs.com/misc/scope

@根据其在npm包名称中的位置有不同的含义。

一个包裹是:

  1. 包含由package.json文件描述的程序的文件夹
  2. 一个包含(1)的带gzip的柏油球
  3. 解析为(2)的url
  4. 使用(3)在注册表上发布的<name>@<version>
  5. 指向(4)的<name>@<tag>
  6. 具有满足(5)的"最新"标签的<name>
  7. 解析为(1)的<git remote url>

npm安装[<@scope>/]<名称>

<scope>是可选的。将从与指定作用域关联的注册表中下载该程序包。如果没有注册表与给定的作用域相关联,则假定为默认注册表。

注意:如果您的作用域名称中没有包含@-符号,npm会将其解释为GitHub存储库,请参阅下文。作用域名称后面还必须跟一个斜线。

npm安装[<@scope>/]<名称><标签>

安装指定标记引用的包的版本。如果该包的注册表数据中不存在该标记,则此操作将失败。

示例:

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

npm安装[<@scope>/]<名称><版本>

安装指定版本的程序包。如果版本尚未发布到注册表,则此操作将失败。

示例:

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

npm安装[<@scope>/]<名称><版本范围>

安装与指定版本范围匹配的程序包版本。

示例:

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用户,你不必担心有人会把你的包名抢在你前面。因此,使用scope模块也是组织npm包的好方法。

使用作用域包的优点

  • 作用域包允许组织管理私有包
  • Scoped包名称只需对其发布所在的范围唯一,而不是对整个npm注册表唯一

通常,组织会选择将其作用域包保密,并且由于各种原因,它们不会出现在公共搜索中。