# npm-docs **Repository Path**: self-denial-cy/npm-docs ## Basic Information - **Project Name**: npm-docs - **Description**: npm docs 学习笔记 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-25 - **Last Updated**: 2022-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: npm ## README # 关于 npm npm 是世界上最大的软件注册表(仓库)。来自各大洲的开源开发人员使用 npm 来共享和借用包,许多组织也使用 npm 来管理私人开发。 npm 由三个不同的组件组成: - 网站 - 命令行界面(CLI) - 注册表(仓库) 使用网站来搜索包、配置个人设置并管理您的 npm 体验的其他方面。例如,您可以设置组织来管理对公共或私有包的访问。 CLI 从终端运行,是大多数开发人员与 npm 交互的方式。 注册表是 JavaScript 软件及其周围元信息的大型公共数据库。 ## 用处 - 为您的应用程序调整代码包,或按原样合并包。 - 下载您可以立即使用的独立工具。 - 运行包而不使用 npx 下载。 - 随时随地与任何 npm 用户共享代码。 - 将代码限制为特定的开发人员。 - 创建组织以协调包维护、编码和开发人员。 - 通过使用组织形成虚拟团队。 - 管理多个版本的代码和代码依赖项。 - 更新底层代码时轻松更新应用程序。 - 发现解决同一个难题的多种方法。 - 寻找正在处理类似问题和项目的其他开发人员。 ## 共享包和与他人协作 如果您选择公开分享您的包,则无需支付任何费用。要使用和共享私有包,您需要升级您的帐户。要与他人分享,请创建组织,称为 npm 组织,并邀请其他人私下(收费)或公开(免费)与您合作。 您还可以使用私有 npm 包注册表,例如 GitHub Packages 或开源 Verdaccio 项目。这使您可以在内部开发不公开共享的包。 # 入门 ## 设置您的 npm 用户帐户 ### 在公共注册表上创建新用户帐户 #### 使用 npm login 测试您的新帐户 1. 在命令行上,键入以下命令: ```shell npm login ``` 2. 出现提示时,输入您的用户名、密码和电子邮件地址。 3. 如果您启用了双重身份验证,则在出现提示时输入一次性密码。 4. 要测试您是否已成功登录,请键入: ```shell npm whoami ``` 5. 应该显示您的 npm 用户名。 ## 故障排除 ### 生成和定位 npm-debug.log 文件 当包安装或发布失败时,npm CLI 将生成一个 npm-debug.log 文件。此日志文件可以帮助您找出问题所在。 如果需要生成 npm-debug.log 文件,可以运行以下命令之一。 如果需要生成 npm-debug.log 文件,可以运行以下命令之一。 对于安装包: ```shell npm install --timing ``` 对于发布包: ```shell npm publish --timing ``` 您可以在 .npm 目录中找到 npm-debug.log 文件。要查找您的 .npm 目录,请使用 npm config get cache。 ### 常见错误 #### 随机错误 - 一些奇怪的问题可以通过简单地运行 npm cache clean 并重试来解决。 - 如果您在使用 npm install 时遇到问题,请使用 -verbose 选项查看更多详细信息。 # 包和模块 ## 包和模块介绍 ### 关于包和模块 npm 中的包,其中许多也是 Node 模块,或者包含 Node 模块。继续阅读以了解它们的不同之处以及它们如何相互作用。 #### 关于包 包是由 package.json 文件描述的文件或目录。包必须包含 package.json 文件才能发布到 npm 注册表。 包可以不限定范围或限定给用户或组织,限定范围的包可以是私有的或公共的。 ##### 关于包格式 包是以下任何一种: - a) 包含由 package.json 文件描述的程序的文件夹。 - b) 包含 (a) 的压缩 tarball。 - c) 解析为 (b) 的 URL。 - d) 使用 (c) 在注册表上发布的 @。 - e) 指向 (d) 的 @。 - f) 具有满足 (e) 的最新标签的 。 - g) 一个 git url,在克隆时会生成 (a)。 ##### npm 包 git URL 格式 用于 npm 包的 Git URL 可以通过以下方式格式化: - `git://github.com/user/project.git#commit-ish` - `git+ssh://user@hostname:project.git#commit-ish` - `git+http://user@hostname/project/blah.git#commit-ish` - `git+https://user@hostname/project/blah.git#commit-ish` commit-ish 可以是可以作为参数提供给 git checkout 的任何标记、sha 或分支。默认的 commit-ish 是 master。 #### 关于模块 模块是 node_modules 目录中可以由 Node.js 的 require() 函数加载的任何文件或目录。 要由 Node.js 的 require() 函数加载,模块必须是以下之一: - 包含 package.json 文件的文件夹,其中包含“main”字段。 - 一个 JavaScript 文件。 注意:由于模块不需要具有 ```shell package.json ``` 文件,并非所有模块都是包。只有模块具有 ```shell package.json ``` 文件也是包。 在 Node 程序的上下文中,模块也是从文件加载的东西。例如,在以下程序中: ```shell var req = require('request') ``` 我们可以说“变量 req 指的是请求模块”。 ### 关于范围 当您注册 npm 用户帐户或创建组织时,您将获得与您的用户或组织名称匹配的范围。您可以将此范围用作相关包的命名空间。 范围允许您创建与其他用户或组织创建的包同名的包,而不会发生冲突。 当在 package.json 文件中列为依赖项时,作用域包的前面是它们的作用域名称。范围名称是 @ 和斜杠之间的所有内容。 #### 范围和包可见性 - 无范围的包总是公开的。 - 私有包总是有范围的。 - 范围包默认是私有的;您必须在发布时传递命令行标志才能将它们公开。 ### 关于公共包 作为 npm 用户或组织成员,您可以创建和发布任何人都可以下载并在自己的项目中使用的公共包。 - 无范围的公共包存在于全局公共注册表命名空间中,并且可以在 package.json 文件中单独使用包名进行引用:package-name。 - 作用域公共包属于用户或组织,当作为依赖项包含在 package.json 文件中时,必须以用户或组织名称开头: - `@username/package-name` - `@org-name/package-name` ### 关于私有包 使用 npm 私有包,您可以使用 npm 注册表来托管仅对您和选定的协作者可见的代码,从而允许您在项目中管理和使用私有代码以及公共代码。 私有包总是有一个作用域,而作用域包默认是私有的。 - 用户范围的私有包只能由您和您授予读取或读/写访问权限的协作者访问。 - 组织范围的私有包只能由已被授予读或读/写访问权限的团队访问。 ### npm 包作用域、访问级别和可见性 npm 包的可见性取决于包所在的范围(命名空间),以及为包设置的访问级别(私有或公共)。 | 范围 | 权限 | 可以查看和下载 | 可以写入(发布) | | :----: | :--: | -------------------------------------- | ------------------------------------ | | 组织 | 私有 | 组织中对包具有读取权限的团队成员 | 组织中对包具有读写权限的团队成员 | | 组织 | 公共 | 所有人 | 组织中对包具有读写权限的团队成员 | | 用户 | 私有 | 包所有者和已被授予对包的读取权限的用户 | 包所有者和被授予对包的读写权限的用户 | | 用户 | 公共 | 所有人 | 包所有者和被授予对包的读写权限的用户 | | 无范围 | 公共 | 所有人 | 包所有者和被授予对包的读写权限的用户 | 注意:只有用户帐户可以创建和管理无范围的包。组织只能管理范围包。 ## 向注册表贡献包 ### 创建一个 package.json 文件 您可以将 package.json 文件添加到您的包中,以方便其他人管理和安装。发布到注册表的包必须包含 package.json 文件。 一个 package.json 文件: - 列出你的项目所依赖的包 - 指定项目可以使用语义版本控制规则使用的包版本 - 使您的构建可重现,因此更容易与其他开发人员共享 注意:为了使您的包更容易在 npm 网站上找到,我们建议在您的 package.json 文件中包含自定义描述。 #### package.json 字段 ##### 必需的名称和版本字段 package.json 文件必须包含“名称”和“版本”字段。 “名称”字段包含您的包的名称,必须是小写字母和一个单词,并且可以包含连字符和下划线。 “版本”字段必须采用 x.x.x 格式并遵循语义版本控制指南。 ##### 作者字段 如果您想在“作者”字段中包含包作者信息,请使用以下格式(电子邮件和网站都是可选的): ```shell Your Name (http://example.com) ``` #### 创建一个新的 package.json 文件 您可以通过运行 CLI 或创建默认 package.json 文件来创建 package.json 文件。 ##### 运行 CLI 要使用您提供的值创建 package.json 文件,请使用 npm init 命令。 1. 在命令行上,导航到包的根目录。 ```shell cd /path/to/package ``` 2. 运行以下命令: ```shell npm init ``` 3. 回答命令行中的问题。 ##### 创建一个默认的 package.json 文件 要使用从当前目录中提取的信息创建默认 package.json,请使用带有 --yes 或 -y 标志的 npm init 命令。 ###### 从当前目录中提取的默认值 - name:当前目录名 - version:始终为 1.0.0 - description:README 中的信息,或空字符串 - scripts:默认创建一个空的测试脚本 - keywords:空 - author:空 - license:ISC - bugs:当前目录中的信息(如果存在) - homepage:当前目录中的信息(如果存在) ##### 为 init 命令设置配置选项 您可以为 init 命令设置默认配置选项。例如,要设置默认作者电子邮件、作者姓名和许可证,请在命令行上运行以下命令: ```shell > npm set init.author.email "example-user@example.com" > npm set init.author.name "example_user" > npm set init.license "MIT" ``` ### 创建 Node.js 模块 Node.js 模块是一种可以发布到 npm 的包。 #### 创建一个 package.json 文件 1. 要创建 package.json 文件,请在命令行中,在 Node.js 模块的根目录中运行 npm init: - 对于有范围的模块,运行 npm init --scope=@scope-name - 对于无范围的模块,运行 npm init 2. 提供必填字段(名称和版本)以及主要字段: - name:模块的名称。 - version:模块的版本。 #### 创建将在另一个应用程序需要您的模块时加载的文件 在文件中,添加一个函数作为导出对象的属性。这将使该函数可用于其他代码: ```js exports.printMsg = function() { console.log("This is a message from the demo package"); } ``` #### 测试你的模块 1. 将你的包发布到 npm 2. 在命令行上,在项目目录之外创建一个新的测试目录 3. 切换到新目录 4. 在测试目录中,安装您的模块 5. 在测试目录中,创建一个 test.js 文件,该文件加载您的模块并将您的模块作为方法调用 6. 在命令行上,运行 node test.js。应该会出现发送到 console.log 的消息 ### 关于软件包 README 文件 为了帮助其他人在 npm 上找到您的包并在他们的项目中使用您的代码获得良好的体验,我们建议在您的包目录中包含一个 README 文件。您的 README 文件可能包含安装、配置和使用包中代码的说明,以及用户可能认为有帮助的任何其他信息。自述文件将显示在包页面上。 npm 包 README 文件必须位于包的根目录中。 #### 创建 README.md 文件并将其添加到包中 1. 在文本编辑器中,在您的包根目录中,创建一个名为 README.md 的文件。 2. 在 README.md 文件中,添加有关您的包的有用信息。 3. 保存 README.md 文件。 #### 更新现有的包 README 文件 README 文件只会在您发布包的新版本时在包页面上更新。要更新您的 README 文件: 1. 在文本编辑器中,更新 README.md 文件的内容。 2. 保存 README.md 文件。 3. 在命令行上,在包根目录中,运行以下命令: ```shell npm version patch npm publish ``` ### 创建和发布无范围的公共包 作为 npm 用户,您可以创建无范围的包以在您自己的项目中使用,并将它们发布到 npm 公共注册表以供其他人在他们的项目中使用。无范围的包始终是公共的,并且仅由包名称引用。 #### 创建一个无范围的公共包 1. 在命令行上,为您的包创建一个目录: ```shell mkdir my-test-package ``` 2. 导航到包的根目录: ```shell cd my-test-package ``` 3. 如果您使用 git 来管理您的包代码,请在包根目录中运行以下命令,将 git-remote-url 替换为您的包的 git 远程 URL: ```shell git init git remote add origin git://git-remote-url ``` 4. 在包根目录中,运行 npm init 命令。 5. 响应提示生成 package.json 文件。 6. 创建一个 README 文件,说明您的包代码是什么以及如何使用它。 7. 在您首选的文本编辑器中,为您的包编写代码。 #### 检查包内容是否有敏感或不必要的信息 将敏感信息发布到注册表可能会损害您的用户,损害您的开发基础架构,修复成本高昂,并使您面临法律诉讼的风险。我们强烈建议您在将包发布到注册表之前删除敏感信息,例如私钥、密码、个人身份信息 (PII) 和信用卡数据。 对于不太敏感的信息,例如测试数据,使用 .npmignore 或 .gitignore 文件来防止发布到注册表。 #### 测试你的包 为了减少发布错误的机会,我们建议在将包发布到 npm 注册表之前对其进行测试。要测试您的包,请使用包目录的完整路径运行 npm install: ```shell npm install my-package ``` #### 发布无范围的公共包 1. 在命令行上,导航到包的根目录。 2. 要将您的公共包发布到 npm 注册表,请运行: ```shell npm publish ``` ### 创建和发布范围公共包 要在用户或组织命名空间中公开共享您的代码,您可以将公共用户范围或组织范围的包发布到 npm 注册表。 #### 创建范围公共包 1. 如果您使用 npmrc 管理多个注册表上的帐户,请在命令行上切换到相应的账户: ```shell npmrc ``` 2. 在命令行上,为您的包创建一个目录: ```shell mkdir my-test-package ``` 3. 导航到包的根目录: ```shell cd my-test-package ``` 4. 如果您使用 git 来管理您的包代码,请在包根目录中运行以下命令,将 git-remote-url 替换为您的包的 git 远程 URL: ```shell git init git remote add origin git://git-remote-url ``` 5. 在包根目录中,运行 npm init 命令并将范围传递给范围标志: - 对于组织范围的包,将 my-org 替换为您的组织名称: ```shell npm init --scope=@my-org ``` - 对于用户范围的包,将 my-username 替换为您的用户名: ```shell npm init --scope=@my-username ``` 6. 响应提示生成 package.json 文件。 7. 创建一个 README 文件,说明您的包代码是什么以及如何使用它。 8. 在您首选的文本编辑器中,为您的包编写代码。 #### 发布范围公共包 默认情况下,范围包以私有形式发布。要发布具有公共可见性的范围包,请使用 npm publish --access public。 ### 创建和发布私有包 要与一组有限的用户或团队共享您的代码,您可以将私有用户范围或组织范围的包发布到 npm 注册表。 #### 发布私有包 默认情况下,范围包以私有形式发布。 ### 包名称指南 为您的包选择名称时,请选择一个名称: - 是独一无二的 - 是描述性的 - 符合 npm 政策指南。例如,不要给你的包起一个冒犯性的名字,不要使用别人的商标名或违反 npm 商标政策。 此外,在为无范围包选择名称时,还要选择一个名称: - 尚未被其他人拥有 - 与另一个包名的拼写方式不同 - 不会在作者身份上与他人混淆 ### 在 package.json 文件中指定依赖项和 devDependencies 要指定您的项目所依赖的包,您必须在包的 package.json 文件中将它们列为“dependencies”或“devDependencies”。当您(或其他用户)运行 npm install 时,npm 将下载 package.json 中列出的满足每个列出的语义版本要求的 dependencies 和 devDependencies。 - “dependencies”:您的应用程序在生产中所需的包。 - “devDependencies”:仅用于本地开发和测试的包。 ### 关于语义版本控制 为了保持 JavaScript 生态系统的健康、可靠和安全,每次你对你拥有的 npm 包进行重大更新时,我们建议在 package.json 文件中发布一个新版本的包,并遵循语义版本控制规格。遵循语义版本控制规范有助于其他依赖您的代码的开发人员了解给定版本的更改程度,并在必要时调整自己的代码。 注意:如果您引入破坏包依赖关系的更改,我们强烈建议增加版本主编号。 #### 在已发布的包中增加语义版本 为了帮助依赖您的代码的开发人员,我们建议您从 1.0.0 开始您的包版本并按如下方式递增: | 代码状态 | 阶段 | 规则 | 示例 | | :------------------: | :------: | :------------------------------------------: | :---: | | 首次发布 | 新产品 | 从 1.0.0 开始 | 1.0.0 | | 向后兼容的错误修复 | 补丁发布 | 增加第三个数字 | 1.0.1 | | 向后兼容的新功能 | 次要版本 | 增加中间数字并将最后一位重置为零 | 1.1.0 | | 破坏向后兼容性的更改 | 主要版本 | 增加第一位数字并将中间和最后一位数字重置为零 | 2.0.0 | #### 使用语义版本控制来指定你的包可以接受的更新类型 您可以从包的 package.json 文件中的 dependencies 中指定您的包可以接受的更新类型。 有关语义版本控制语法的更多信息,请参阅 [npm semver calculator](https://semver.npmjs.com/)。 ### 将 dist-tags 添加到包中 分发标签 (dist-tags) 是人类可读的标签,您可以使用它来组织和标记您发布的不同版本的包。 dist-tags 补充语义版本控制。除了比语义版本编号更易于人类阅读之外,还允许发布者更有效地分发他们的包。 > 注意:由于 dist-tags 与语义版本编号共享一个命名空间,请避免与现有版本号冲突的 dist-tags。我们建议避免使用以数字或字母“v”开头的 dist-tags。 #### 发布带有 dist-tag 的包 默认情况下,运行 npm publish 将使用最新的 dist-tag 标记您的包。要使用另一个 dist-tag,请在发布时使用 --tag 标志。 1. 在命令行上,导航到包的根目录。 2. 运行以下命令,将 tag 替换为您要使用的标签: ```shell npm publish --tag ``` ##### 示例 要发布带有“beta”dist-tag 的包,请在命令行中,在包的根目录中运行以下命令: ```shell npm publish --tag beta ``` #### 将 dist-tag 添加到包的特定版本 1. 在命令行上,导航到包的根目录。 2. 运行以下命令,将 package_name 替换为您的包名称,将 version 替换为您的包版本号,将 tag 替换为分发标签: ```shell npm dist-tag add @ [] ``` ##### 示例 要将“stable”标签添加到“example-package”包的 1.4.0 版本,您将运行以下命令: ```shell npm dist-tag add example-package@1.4.0 stable ``` ## 更新和管理已发布的包 ### 更改包可见性 您可以从网站或命令行更改范围包的可见性。 您必须是拥有包的用户帐户或组织的所有者才能更改包的可见性。 > 注意:您不能更改无范围包的可见性。只有付费订阅的范围包可能是私有的。 #### 将公共包设为私有 > 注意:将包设为私有需要付费用户帐户或组织。 如果您想限制您拥有的公共包的访问和可见性,您可以将包设为私有。当您将包设为私有时,其访问权限将立即更新,并在更改后的几分钟内从网站上删除。 ##### 使用网站 1. 在 npm 网站上,转到包页面 2. 在包页面上,单击 **Admin** 3. 在 “Package Access” 下,选择 “Is Package Private?” 4. 单击 **Update package settings** ##### 使用命令行 要在命令行上将公共包设为私有,请运行以下命令,将 package-name 替换为您的包的名称: ```shell npm access restricted ``` #### 公开私有包 注意:当您公开一个私有包时,该包将对所有 npm 用户可见并可供下载。 ##### 使用网站 1. 在 npm 网站上,转到包页面 2. 在包页面上,单击 **Admin** 3. 在“Package Access”下,取消选择“Is Package Private?” 4. 单击 **Update package settings** ##### 使用命令行 要在命令行上公开私有包,请运行以下命令,将 package-name 替换为您的包的名称: ```shell npm access public ``` ### 将协作者添加到用户帐户拥有的私有包中 作为具有付费用户帐户的 npm 用户,您可以将另一个具有付费帐户的 npm 用户作为您拥有的私有包的协作者。 当您将成员添加到您的包时,他们会收到一封电子邮件,邀请他们加入包。新成员必须接受邀请才能访问包。 #### 从网站上授予私有包访问权限 1. 在 npm 网站上,转到要添加协作者的包 2. 在包页面的“Collaborators”下,单击 + 3. 输入协作者的 npm 用户名 4. 单击 **Submit** #### 从命令行界面授予私有包访问权限 要在命令行上将协作者添加到包中,请运行以下命令,将 user 替换为协作者的 npm 用户名,并将 your-package-name 替换为私有包的名称: ```shell npm owner add ``` #### 授予私有组织包的访问权限 要授予 npm 用户对私有组织包的访问权限,您必须让组织所有者将他们添加到您的组织,然后将他们添加到有权访问私有包的团队中。 ### 更新您发布的软件包版本号 当您对已发布的包进行重大更改时,我们建议您更新版本号,以便将更改的范围传达给依赖您的代码的其他人。 > 注意:如果您已将 git 存储库链接到包,更新包版本号也会将带有更新版本号的标签添加到链接的 git 存储库。 1. 要更改 package.json 中的版本号,请在命令行的包根目录中运行以下命令,update_type 替换为语义版本控制版本类型之一(patch、minor、major): ```shell npm version npm version patch npm version minor npm version major ``` 2. 运行 npm publish 3. 转到您的包页面以检查包版本是否已更新 ### 弃用和取消弃用包或包版本 如果您不再希望维护一个包,或者如果您想鼓励用户更新到新的或不同的版本,您可以弃用它。弃用一个包或版本将在用户安装它时向终端打印一条消息。 弃用警告或消息可以说明任何内容。您可能希望包含一条消息,鼓励用户更新到特定版本或替代的受支持软件包。 > 注意:我们强烈建议弃用包或包版本而不是取消发布它们,因为取消发布会从注册表中完全删除一个包,这意味着任何依赖它的人将无法再使用它,而不会发出警告。 #### 弃用整个包 弃用整个包会将其从 npm 网站的搜索结果中删除,并且包页面上也会显示弃用消息。 如果您的包不符合取消发布要求,则弃用包是删除包的替代方法。 ##### 使用网站 1. 使用您的用户帐户登录到 npm 2. 导航到要弃用的包的包页面 3. 单击 **Settings** 4. 在“deprecate package”下,单击 **Deprecate package** 5. 如果您确定要继续,请输入您的包名称并单击 **Deprecate package** ##### 使用命令行 要弃用整个包,请运行以下命令,将 package-name 替换为您的包的名称,并将 message 替换为您的弃用消息: ```shell npm deprecate "" ``` 如果您启用了双重身份验证,请在命令中添加一次性密码 --otp=123456(其中 123456 是您的身份验证器应用程序的代码)。 #### 弃用包的单个版本 当您弃用某个版本的包时,该版本的包页面上将显示一条红色消息,类似于弃用整个包。 ##### 使用命令行 要弃用包版本,请运行以下命令,将 package-name 替换为您的包名称,将 version 替换为您的版本号,并将 message 替换为您的弃用消息: ```shell npm deprecate @ "" ``` CLI 还将接受 version 的版本范围。 如果您有双重身份验证,请在命令中添加一次性密码 --otp=123456(其中 123456 是您的身份验证器的代码)。 #### 取消弃用包或版本 要取消弃用包,请将上述命令之一中的 message 替换为空字符串。 例如,要取消弃用包版本,运行以下命令,将 package-name 替换为您的包名称,将 version 替换为您的版本号: ```shell npm deprecate @ "" ``` 如果您有双重身份验证,请在命令中添加一次性密码 --otp=123456(其中 123456 是您的身份验证器的代码)。 #### 将弃用的包移交给 npm 如果你不再维护一个包,但其他用户依赖它,并且你想从你的账号中删除它,你可以将它转移到 @npm 用户帐户,该帐户归 npm 注册表所有。 > 注意:一旦您将包转移到 npm 帐户,您将无法再更新它。 要将包转移到 npm 用户帐户,请按顺序运行以下两个命令,将 user 替换为您的 npm 用户名,将 package-name 替换为您要转移的包: ```shell npm owner add npm npm owner rm ``` 如果您有双重身份验证,请在命令中添加一次性密码 --otp=123456(其中 123456 是您的身份验证器的代码)。 ### 将包从用户帐户转移到另一个用户帐户 作为包所有者或维护者,您可以使用 npm 网站或命令行将不再希望维护的包的所有权转让给另一个受信任的 npm 用户。 > 注意:您不能将范围包转移到另一个用户帐户或组织,因为包的范围是用户帐户或组织名称。您将需要在新范围内创建一个新包。 #### 在网站上将包从用户帐户转移到另一个用户帐户 要将您拥有或维护的包转让给其他用户,请执行以下步骤: 1. 导航到要传输的包页面 2. 在包 Admin 选项卡上,在“Maintainers”下,输入新维护者的 npm 用户名 3. 点击 Invite 4. 要删除自己的维护者身份,请在维护者列表下,单击您的用户名旁边的“x” #### 在命令行上将包从用户帐户转移到另一个用户帐户 要使用 CLI 将包传输给另一个 npm 用户,请运行 npm owner add 命令,将 their-username 替换为其他用户的 npm 用户名。向其他用户发送电子邮件邀请。用户接受邀请后,运行 npm owner rm 命令,将 your-username 替换为您的 npm 用户名: ```shell npm owner add # new maintainer accepts invitation npm owner rm ``` 如果您启用了双重身份验证,请在命令中添加一次性密码 --otp=123456(其中 123456 是您的身份验证器的代码)。 ### 从注册表中取消发布包 作为包所有者或维护者,如果您的包没有使用者,您可以使用 CLI 将其从 npm 注册表中永久删除。您可以在首次发布后 72 小时内取消发布;超过 72 小时,如果符合特定条件,您仍然可以取消发布您的包。 设置这些标准是为了避免破坏 JavaScript 包生态系统。如果您无法取消发布您的包,您可以改为弃用它。 > 注意:从包中删除所有协作者或团队不会取消发布它。 #### 取消发布包 如果您想从注册表中完全删除一个包的所有版本,您可以完全取消发布它。这将从注册表中删除它,并且将无法被安装。 要取消发布包,您必须满足包取消发布规则的要求。 ##### 使用网站 1. 使用您的用户帐户登录到 npm 2. 导航到要取消发布的包页面 3. 点击 **Settings** 4. 在 delete package 下,点击 **Delete package** > 注意:如果由于包不符合取消发布要求而无法删除包,则删除包选项将不可用。而且,系统会提示您弃用该包。 5. 如果您确定要继续,请输入您的包名称并单击 **Delete package** ##### 使用命令行 要取消发布整个包,请运行以下命令,将 package-name 替换为您的包名称: ```shell npm unpublish -f ``` 如果您启用了双重身份验证,则需要向取消发布命令添加一次性密码 --otp=123456(其中 123456 是您的身份验证器的代码)。 > 注意:如果您取消发布整个包,则必须在 24 小时后才能发布该包的任何新版本。 #### 取消发布包的单个版本 如果要删除包的单个版本,可以取消发布一个版本而不影响其他版本。这只会从注册表中删除该版本,并且将无法被安装。此操作仅通过 CLI 可用。 ##### 使用命令行 要取消发布包的单个版本,请运行以下命令,将 package-name 替换为您的包名称,并将 version 替换为您的版本号: ```shell npm unpublish @ ``` #### 何时取消发布 取消发布包会从注册表中永久删除该包,因此其他用户无法再安装该包。取消发布包后,以相同名称重新发布将被阻止 24 小时。如果您错误地取消发布了一个包,我们建议您以不同的名称再次发布,或者对于未发布的版本,增加版本号并再次发布。 您可能想要取消发布包,因为您: - 不小心发布了一些东西 - 想测试 npm - 您不打算公开的已发布内容 - 想要重命名一个包(重命名包的唯一方法是以新名称重新发布它) > 注意:package-name@version 是唯一的,不能通过取消发布和重新发布来重复使用。我们建议改为发布次要版本更新。 #### 何时弃用 如果您不再对维护包感兴趣,但希望它仍然可供用户安装,或者如果您的包有使用者,我们建议您弃用它。 ## 从注册表中获取包 ### 搜索并选择要下载的包 您可以使用 npm 搜索栏来查找要在项目中使用的包。 #### 搜索包 1. 在搜索栏中,键入搜索词并按 Enter。在您键入时,将出现可能的选择 2. 要列出根据包搜索排名标准排列的包,请在左侧边栏中的“Sort packages”下,单击该标准。例如,要按受欢迎程度对包进行排序,请单击“Popularity” 3. 在包搜索结果列表中,单击包的名称 #### 包搜索排名标准 通常,有数十个甚至数百个具有相似名称和/或相似用途的包。为了帮助您确定要搜索的最佳包,我们使用 npms 分析器根据四个标准对每个包进行了排名: ##### Popularity 流行度表示包已下载了多少次。这是其他人发现有用的包的有力指标。 ##### Quality 质量包括诸如 README 文件的存在、稳定性、测试、最新的依赖项、自定义网站和代码复杂性等考虑因素。 ##### Maintenance 维护根据开发人员对包的关注程度对包进行排名。例如,更频繁维护的包更有可能与当前或即将发布的 npm CLI 版本一起工作。 ##### Optimal Optimal 以一种有意义的方式将其他三个标准(受欢迎程度、质量、维护)组合成一个分数。 ### 在本地下载和安装包 如果你在自己的项目中依赖某一个包,你可以在本地安装一个包,使用类似 Node.js require 的东西。这是 npm install 的默认行为。 #### 安装一个无范围包 无范围包始终是公开的,这意味着任何人都可以搜索、下载和安装它们。要安装公共包,请在命令行上运行: ```shell npm install ``` 这将在您的当前目录中创建 node_modules 目录(如果尚不存在)并将包下载到该目录。 > 注意:如果本地目录下没有 package.json 文件,则安装最新版本的包。 > 如果有 package.json 文件,npm 会安装满足 package.json 中声明的 semver 规则的最新版本。 #### 安装一个范围公共包 范围公共包可以被任何人下载和安装,只要在安装过程中引用了范围名称: ```shell npm install @scope/package-name ``` #### 安装一个私有包 私有包只能由被授予对包的读取权限的人下载和安装。由于私有包始终是有范围的,因此您必须在安装过程中引用范围名称: ```shell npm install @scope/private-package-name ``` #### 测试包安装 为了确认 npm install 正常工作,在你的项目目录中,检查 node_modules 目录是否存在,并且它是否包含你安装的包目录: ```shell ls node_modules ``` #### 安装包版本 如果运行 npm install 的目录中有 package.json 文件,npm 会安装满足 package.json 中声明的语义版本控制规则的最新版本的包。 如果没有 package.json 文件,则安装最新版本的包。 #### 使用 dist-tags 安装包 和 npm publish 一样,npm install package_name 默认会使用 latest 标签。 要覆盖此行为,请使用 npm install package_name@tag。例如: ```shell npm install example-package@beta ``` ### 全局下载和安装包 > 提示:如果您使用的是 npm 5.2 或更高版本,我们建议使用 npx 全局运行包。 全局安装包允许您将包中的代码用作本地计算机上的一组工具。 要全局下载和安装包,请在命令行上运行以下命令: ```shell npm install -g ``` 如果您收到 EACCES 权限错误,您可能需要使用版本管理器重新安装 npm 或手动更改 npm 的默认目录。 ### 解决全局安装包时的 EACCES 权限错误 如果您在尝试全局安装包时看到 EACCES 错误,您可以: - 使用 Node 版本管理器重新安装 npm(推荐) - 手动更改 npm 的默认目录 #### 使用 Node 版本管理器重新安装 npm 这是避免权限问题的最佳方法。要使用 Node 版本管理器重新安装 npm,请按照 [Downloading and installing Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) 中的步骤操作。在安装 Node 版本管理器之前,您无需删除当前版本的 npm 或 Node.js。 ### 更新从注册表下载的包 更新从注册表下载的本地和全局包有助于保持代码和工具稳定、可用和安全。 #### 更新本地包 我们建议定期更新您的项目所依赖的本地包,以在改进其依赖项时改进您的代码。 1. 导航到项目的根目录并确保它包含 package.json 文件 2. 在您的项目根目录中,运行: ```shell npm update ``` 3. 要测试更新,请运行命令,不应该有任何输出: ```shell npm outdated ``` #### 更新全局安装的包 > 注意:如果您使用的是 npm 版本 2.6.0 或更低版本,请运行此脚本以更新所有过时的全局包。 > 但是,请考虑升级到最新版本的 npm: > > ```shell > npm install npm@latest -g > ``` ##### 确定哪些全局包需要更新 要查看需要更新哪些全局包,请在命令行上运行: ```shell npm outdated -g --depth=0 ``` ##### 更新单个全局包 要更新单个全局包,请在命令行上运行: ```shell npm update -g ``` ##### 更新所有全局安装的包 要更新所有全局包,请在命令行上运行: ```shell npm update -g ``` ### 在项目中使用 npm 包 一旦你在 node_modules 中安装了一个包,你就可以在你的代码中使用它。 #### 在项目中使用无范围包 ##### Node.js 模块 如果您正在创建 Node.js 模块,则可以通过将包作为参数传递给 require 函数来使用模块中的包。 ```javascript var lodash = require('lodash'); var output = lodash.without([1, 2, 3], 1); console.log(output); ``` ##### package.json 文件 ```json { "dependencies": { "@package_name": "^1.0.0" } } ``` #### 在项目中使用范围包 要使用范围包,只需在使用包名称的任何位置包含范围即可。 ##### Node.js 模块 ```javascript var projectName = require("@scope/package-name") ``` ##### package.json 文件 ```json { "dependencies": { "@scope/package_name": "^1.0.0" } } ``` #### 解决 Cannot find module 错误 如果您没有正确安装包,当您尝试在代码中使用它时会收到错误消息。例如,如果您引用 lodash 包而不安装它,您会看到以下错误: ```shell module.js:340 throw err; ^ Error: Cannot find module 'lodash' ``` - 对于范围包,运行 npm install @scope/package_name - 对于无范围包,运行 npm install package_name ### 使用已弃用的包 如果您安装了一个包,并且它会打印一条弃用消息,我们建议您尽可能按照说明进行操作。 这可能意味着更新到新版本,或更新您的依赖项。 弃用消息并不总是意味着包或版本不可用。这可能意味着该包未维护,发布者将不再更新。 ### 卸载包和依赖项 如果您不再需要在代码中使用包,我们建议将其卸载并将其从项目的依赖项中删除。 #### 卸载本地包 ##### 从 node_modules 目录中删除本地包 ###### 无范围包 ```shell npm uninstall ``` ###### 范围包 ```shell npm uninstall <@scope/package_name> ``` ##### 从 package.json 依赖项中删除本地包 ###### 无范围包 ```shell npm uninstall --save ``` ###### 范围包 ```shell npm uninstall --save <@scope/package_name> ``` > 注意:如果您将包安装为 devDependency(即使用--save-dev),请使用 --save-dev 卸载它: > > ```shell > npm uninstall --save-dev package_name > ``` #### 卸载全局包 ##### 无范围包 ```shell npm uninstall -g ``` ##### 范围包 ```shell npm uninstall -g <@scope/package_name> ``` ## 保护您的代码 ### 关于审核报告 审核报告包含有关项目依赖项中的安全漏洞的信息表,以帮助您修复漏洞或进一步排除故障。 #### 漏洞表字段 ##### 严重性 漏洞的严重性,由漏洞在其最常见用例中的影响和可利用性决定。 | 严重性 | 推荐措施 | | :------: | :------------------: | | Critical | 立即解决 | | High | 尽快解决 | | Moderate | 时间允许的情况下解决 | | Low | 随时都可以解决 | ##### 描述 漏洞描述 ##### 包 包含漏洞的包名称 ##### 已修复 描述哪些版本包含漏洞修复程序的语义版本范围 ##### 依赖项 存在漏洞的包所依赖的模块 ##### 路径 包含漏洞的代码的路径 ##### 更多信息 安全报告的链接 ### 审核包依赖项的安全漏洞 #### 关于安全审核 安全审核是对安全漏洞的包依赖关系的评估。安全审核使您能够发现并修复依赖项中可能导致数据丢失、服务中断、未经授权访问敏感信息或其他问题的已知漏洞,从而帮助您保护包的用户。 #### 使用 npm audit 运行安全审核 > 注意: npm audit 命令在 npm@6 中可用 npm audit 命令将包中配置的依赖项的描述提交到默认注册表,并要求报告已知漏洞。 npm audit 检查 dependencies、devDependencies、bundledDependencies 和 optionalDependencies,但不检查 peerDependencies。 当您使用 npm install 安装包时,npm audit 会自动运行。您还可以在本地安装的包上手动运行 npm audit 以对包进行安全审核,并生成依赖漏洞报告,如果可用,建议补丁。 1. 在命令行上,导航到包根目录 2. 确保您的包根目录包含 package.json 和 package-lock.json 文件 3. 运行 npm audit 4. 查看审核报告并运行推荐的命令或在需要时进一步调查 ##### 解决 EAUDITNOPJSON 和 EAUDITNOLOCK 错误 npm audit 要求包有 package.json 和 package-lock.json 文件。 #### 审查安全审核报告并采取行动 运行 npm audit 将生成安全漏洞报告,其中包含受影响的包名称、漏洞严重性和描述、路径和其他信息,以及应用补丁解决漏洞的命令(如果可用)。 ##### 发现有推荐更新的安全漏洞 如果发现安全漏洞并且有可用更新,您可以: - 运行 npm audit fix 子命令以自动为易受攻击的依赖项安装兼容更新 - 单独运行推荐的命令以安装易受攻击的依赖项的更新 ###### SEMVER 警告 如果建议的操作是潜在的重大更改(语义版本重大更改),则后面会出现 SEMVER WARNING,上面写着 SEMVER WARNING: Recommended action is a potentially breaking change。如果存在漏洞的包更改了其 API,您可能需要对包的代码进行额外的更改。 ##### 发现需要人工审查的安全漏洞 如果发现安全漏洞,但没有可用的补丁,审核报告将提供有关漏洞的信息,以便您进一步调查。 ###### 检查让步条件 查看更多信息字段中的安全公告,了解可能允许您在有限情况下继续使用包含漏洞的包。例如,该漏洞可能仅在代码用于特定操作系统或调用特定函数时存在。 ###### 如果存在修复程序,则更新依赖包 如果存在修复程序,但依赖于具有漏洞的包的包尚未更新以包含修复版本,则您可能希望在依赖包存储库上打开拉取或合并请求以使用修复版本。 1. 要查找必须更新的包,请检查 Path 字段以获取存在漏洞的包的位置,然后检查依赖于它的包。例如,如果漏洞的路径是@package-name >dependent-package > package-with-vulnerability,则需要更新dependent-package 2. 在 npm 网站上,找到依赖包并导航到其存储库 3. 在依赖包存储库中,打开拉取或合并请求以将漏洞包的版本更新为具有修复的版本 4. 一旦拉取或合并请求被受理并且在 npm 网站上该包已更新,即可运行 npm update 更新 ###### 修复漏洞 如果修复程序不存在,您可能希望在包存储库的拉取或合并请求中向包维护者建议解决漏洞的更改。 ###### 在包或依赖包问题跟踪器中打开问题 如果您不想自己修复漏洞或更新依赖包,请在包或依赖包问题跟踪器中打开问题。 ##### 未发现安全漏洞 如果没有发现安全漏洞,这意味着在你的包依赖树中没有找到具有已知漏洞的包。由于咨询数据库可以随时更新,我们建议定期手动运行 npm audit,或者将 npm audit 添加到您的持续集成过程中。 #### 在安装包时关闭 npm audit ##### 安装单个包 ```shell npm install example-package-name --no-audit ``` ##### 安装所有包 ```shell npm set audit false ``` ### 包发布和设置修改需要 2FA 为了保护您的包,作为包发布者,您可以要求对包具有写入权限的每个人都启用双因素身份验证 (2FA)。这将要求用户在发布包时除了提供登录凭证外还提供 2FA 凭据。 您还可以选择允许使用双因素身份验证或使用自动化令牌进行发布。这允许您在 CI/CD 工作流中配置自动化令牌,但需要来自交互式发布的两因素身份验证。 #### 配置双重身份验证 1. 使用您的用户帐户登录到 npm 2. 导航到包页面 3. 点击 **Settings** 4. 在 Publishing access 下,选择发布包的要求 1. 不需要双重身份验证 使用此选项,维护者可以发布包或更改包设置,无论他们是否启用了双因素身份验证。这是最不安全的设置 2. 需要双重身份验证或自动化令牌 使用此选项,维护者必须为其帐户启用双重身份验证。如果他们使用 npm publish 命令以交互方式发布包,则在执行发布时将需要输入 2FA 凭据。但是,维护者也可以创建一个自动化令牌并使用它来发布。使用自动化令牌时不需要第二个因素,这使其对持续集成和持续部署工作流很有用 3. 仅双重身份验证 使用此选项,维护者必须为其帐户启用双因素身份验证,并且必须以交互方式发布。维护者在执行发布时需要输入 2FA 凭据 5. 点击 **Update Package Settings** ### 报告 npm 包中的恶意软件 如果您在 npm 包(您的或其他人的)中发现恶意软件,您可以将其报告给 npm 安全团队,以帮助保持 Javascript 生态系统的安全。 > 注意:npm 包中的漏洞应直接报告给包维护者。我们强烈建议您私下进行。您可以使用 npm owner ls package-name 找到有关包维护者的联系信息。如果源代码托管在 GitHub 上,请参阅存储库的安全策略。 #### npm Security 如何处理恶意软件 恶意软件是 npm 安全的主要问题,我们已经从注册表中删除了数百个恶意包。对于我们收到的每个恶意软件报告,npm Security 都会采取以下措施: 1. 确认报告的有效性 2. 从注册表中删除包 3. 发布包的安全占位符 4. 发布安全公告提醒社区 作为我们流程的一部分,我们确定是否应该禁止上传包的用户帐户。我们还会在适用的情况下与第三方合作。 #### 报告恶意软件 1. 收集有关恶意软件的信息 2. 在包页面上,点击 **Report malware** 3. 在恶意软件报告页面上,提供有关您自己和恶意软件的信息 4. 点击 **Send Report** # 集成 ## 将 npm 与外部服务集成 ### 关于访问令牌 > 注意:您必须使用 npm 5.5.1 或更高版本才能使用访问令牌 在使用 API 或 npm 命令行界面 (CLI) 时,访问令牌是使用您的用户名和密码对 npm 进行身份验证的替代方法。访问令牌是可用于身份验证的十六进制字符串,它赋予您安装和/或发布包的权利。 当你运行 npm login 时,npm CLI 会自动为你生成一个访问令牌。您还可以创建一个访问令牌,让其他工具(例如持续集成测试环境)访问您的 npm 包。例如,GitHub Actions 提供了存储密钥(例如访问令牌)的功能,然后您可以使用这些密钥进行身份验证。当您的工作流程运行时,它将能够像您一样完成 npm 任务,包括安装您可以访问的私有包。 您可以使用来自 Web 或 CLI 的令牌,以最简单的为准。您在每个环境中所做的事情都会反映在另一个环境中。 npm 令牌命令让您: - 查看令牌以便于跟踪和管理 - 创建新令牌,指定只读或完全权限 - 根据 IP 地址范围 (CIDR) 限制访问 - 删除/撤销令牌 ### 创建和查看访问令牌 您可以从网站和命令行界面 (CLI) 创建和查看访问令牌。 #### 创建访问令牌 ##### 在网站上创建 1. 在页面的右上角,单击您的个人资料图片,然后单击访问令牌 2. 点击 **Generate New Token** 3. 命名您的令牌(可选) 4. 选择访问令牌的类型: - **Read-only**:只读令牌只能用于从注册表下载包。它将有权读取您有权访问的任何私有包。对于安装包但不发布新包的自动化和工作流程,建议使用此方法 - **Automation**:自动化令牌可以下载包并发布新包,但如果您在帐户上配置了双重身份验证 (2FA),则不会强制执行。即使您无法输入一次性密码,您也可以在持续集成工作流和其他自动化系统中使用自动化令牌来发布包。推荐用于发布新包的自动化工作流程 - **Publish**:发布令牌可以代表您执行任何操作,包括下载包、发布包以及更改用户设置或包设置。如果您在帐户上配置了双重身份验证,则在使用发布令牌时将需要输入一次性密码。建议将其用于交互式工作流程 5. 点击 **Generate Token** 6. 从页面顶部复制令牌 ##### 使用 CLI 创建令牌 您可以创建具有只读权限的令牌或使用 CLI 读取和发布权限;您目前无法创建自动化令牌。 - **Read-only**:仅允许安装和分发,但没有与您的帐户相关的发布或其他权利的令牌 - **Publish**:新令牌的默认设置和最宽松的令牌类型。发布令牌允许安装、分发、修改、发布以及您对您的帐户拥有的所有权利 此外,您可以使用 CIDR 表示法指定令牌仅对特定 IPv4 地址范围有效。令牌仅在从指定的 IP 地址使用时才有效。 1. 要创建新令牌,请在命令行上运行: - npm token create 用于读取和发布令牌 - npm token create --read-only 用于只读令牌 - npm token create --cidr=[list] 用于 CIDR 限制的读取和发布令牌。例如,npm token create --cidr=192.0.2.0/24 - npm token create --read-only --cidr=[list] 用于受 CIDR 限制的只读令牌 2. 出现提示时,输入您的密码 3. 如果您启用了双重身份验证,则在出现提示时输入一次性密码 4. 从命令输出中的令牌字段复制令牌 ###### CIDR 限制的令牌错误 如果您输入的 CIDR 字符串无效或格式不正确,您将收到类似于以下错误的错误: ```shell npm ERR! CIDR whitelist contains invalid CIDR entry: X.X.X.X./YY,Z.Z.. . . ``` 确保您使用的是有效的 IPv4 地址并再次尝试创建令牌。 #### 查看访问令牌 > 注意:永远不会显示完整的令牌,只会显示第一个和最后四个字符。您只能在创建后立即查看完整的令牌。 ##### 在网站上查看令牌 要查看与您的帐户关联的所有令牌,请在页面的右上角单击您的个人资料图片,然后单击访问令牌。 ##### 在 CLI 上查看令牌 要查看与您的帐户关联的所有令牌,请在命令行上运行以下命令: ```shell npm token list ``` ###### 令牌属性 - **id**:使用令牌 ID 来引用命令中的令牌 - **token**:实际令牌的前几位 - **create**:创建令牌的日期 - **readonly**:如果是,则表示只读令牌。如果否,则表示具有读取和发布权限的令牌 - **CIDR whitelist**:通过 IP 地址限制令牌使用 ### 撤销访问令牌 为了确保您的帐户和包安全,我们强烈建议您撤销(删除)您不再需要或已被盗用的令牌。您可以撤销您创建的任何令牌。 > 注意:虽然访问令牌不是从您的密码派生的,但更改密码将使您的所有令牌失效。您还可以通过在使用该令牌登录的计算机上注销来使单个令牌无效。我们建议撤销而不是使令牌无效。 1. 要查看令牌列表,请在命令行上运行: ```shell npm token list ``` 2. 在令牌表中,找到并复制要删除的令牌的 ID 3. 在命令行上,运行以下命令,将 123456 替换为要删除的令牌的 ID: ```shell npm token delete 123456 ``` 4. 要确认令牌已被删除,请运行: ```shell npm token list ``` > 注意:您必须使用令牌 ID 来删除令牌,而不是令牌的截断版本。在某些情况下,成功撤销令牌之前可能会有长达一小时的延迟。 # 组织 ## 创建和管理组织 ### 创建组织 任何 npm 用户都可以创建一个组织来管理代码贡献者对该组织管理的包的访问。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的个人资料图片,然后单击添加组织 3. 在组织创建页面的名称字段中,键入您的组织的名称。您的组织名称也将是您的组织范围 4. 在名称字段下,选择“无限私人套餐”付费方案或“无限公共套餐”免费方案,然后单击购买或创建 5. (可选)在组织邀请页面上,输入您想作为成员添加到组织中的人员的 npm 用户名或电子邮件地址,然后选择要邀请他们加入的团队,然后单击邀请 6. 点击继续 ### 将您的用户帐户转换为组织 如果您有 npm 用户帐户,则可以将您的用户帐户转换为组织。当您将用户帐户转换为组织时,我们将: - 使用您的用户帐户名称创建一个新组织 - 提示您创建一个新的 npm 用户帐户。我们建议您选择旧用户名的变体,以便合作者认出您。例如,如果您的旧用户名是“wombat”,那么您的新用户名可能是“wombat-new” - 使您的新 npm 用户帐户成为您的新组织的所有者 - 将您的新 npm 用户帐户添加到新组织中名为“开发人员”的团队中 - 将您的用户帐户拥有的软件包转移到您的新组织 - 将您现有的组织和团队成员身份以及贡献者访问设置转移到您的新用户帐户 注意:一旦您的旧用户帐户转换为组织,您将无法再使用旧用户帐户登录 npm。 ### 在您的组织中设置双重身份验证 组织所有者可以要求组织成员为其个人帐户启用双重身份验证,从而使恶意行为者更难访问组织的包和设置 #### 关于组织的双重身份验证 双重身份验证 (2FA) 是登录网站或应用程序时使用的额外安全层。您可以要求组织中的所有成员在 npm 上启用双重身份验证。 > 注意: > > - 当您需要为您的组织使用双重身份验证时,不使用 2FA 的成员将从组织中删除并无法访问其包。如果他们启用了双重身份验证,您可以将他们添加回组织 > - 如果组织所有者未在其帐户上启用 2FA,则组织所有者无法选择要求组织进行 2FA > - 如果您是需要 2FA 的组织的成员,您将无法禁用 2FA,直到您离开该组织 #### 先决条件 在您可以要求组织成员使用双重身份验证之前,您必须在 npm 上为您的帐户启用双重身份验证。 在您需要使用双重身份验证之前,我们建议通知组织成员并要求他们为其帐户设置 2FA。您可以在组织成员页面查看成员是否已经使用 2FA。 #### 在您的组织中设置双重身份验证 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击成员 5. 单击启用 2FA 强制执行按钮 6. 如果出现提示,请阅读有关将从组织中删除的成员的信息。键入您的组织名称以确认更改,然后单击删除成员并要求双重身份验证 7. 如果有任何成员从组织中删除,我们建议向他们发送邀请,以恢复他们以前的权限和对您组织的访问权限。他们必须先启用双重身份验证,然后才能接受您的邀请 #### 帮助被移除的成员和外部合作者重新加入您的组织 如果在您启用双重身份验证时从组织中删除了任何成员,他们将收到一封电子邮件,通知他们已被删除。然后,他们应为其个人帐户启用 2FA,并联系组织所有者以请求访问您的组织。 ### 重命名组织 不能从网站或命令行界面重命名组织。 要重命名组织,作为组织所有者,您必须手动将现有组织成员、团队和包迁移到新组织,然后联系 npm 官方支持取消发布过时的包并删除以前的组织。 1. 使用您想要的名称创建一个新组织。如果您的旧组织采用付费方案,您必须为新组织选择付费方案 2. 将旧组织的成员添加到新组织 3. 在您的新组织中,创建团队以匹配旧组织中的团队 4. 通过更新 package.json 文件中的包范围以匹配新的组织名称并运行 npm publish,将包重新发布到新组织 5. 在新组织团队中,配置包访问权限以匹配旧组织中的团队包访问权限 6. 联系 npm 官方支持取消发布过时的包并删除以前的组织 ### 删除组织 组织管理员可以删除组织;如果组织中的包满足取消发布包的要求,它们也将被删除。不能删除的包可以被弃用。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击要删除的组织的名称 4. 在组织设置页面上,单击 **Billing** 5. 在“delete organization”下,单击 **Delete** 6. 您将获得组织中的包的概述,以及当您的组织被删除时它们会发生什么。可以取消发布的包将被删除。如果您确定要继续,请输入您的组织名称并单击 **Delete this organization** ## 为您的组织付款 ### 升级到付费组织方案 作为组织所有者,您可以将免费组织方案升级到 npm Teams 产品。 npm Teams 是一项付费方案,让组织成员能够安装和发布私有包。 如果您的组织具有付费方案,则您的组织将花费您每个用户每月七 (7) 美元。 7 美元的费用是对组织的任何成员的固定费用,即使该成员所属的团队无法访问私人包。 新添加到组织的成员始终在下一个计费周期内计费。 注意:您的付费方案和计费周期将在您提交信用卡信息时开始,您将立即支付第一个月的费用。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击要升级的组织的名称 4. 在组织设置页面上,单击 **Billing** 5. 在“change plan”下,单击 **Upgrade Plan ($7/User)** 6. 在“Want to upgrade?”下,点击 **Enable Private Publishing for $7/mo** 7. 在计费信息对话框中,输入您的计费信息: - Email:用于帐单联系人的电子邮件地址 - Name:用于支付的信用卡上的姓名 - Street, City, ZIP Code, Country:与信用卡关联的帐单地址 8. 点击 **Payment Info** 9. 在信用卡信息对话框中,输入您的信用卡信息: - 卡号 - MM / YY:卡到期日期的月份和年份 - CVC:信用卡上的三位代码 10. 要在 npm 上保存您的信用卡信息以用于其他付款,请选择“Remember me” 11. 点击 **Pay** 每月金额。每月金额将是您组织中的成员数量乘以 7 美元 ### 查看、下载和通过电子邮件发送组织的收据 作为组织所有者,您可以查看、下载和通过电子邮件发送您组织的完整账单历史记录的收据。 #### 查看收据 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您要查看其账单收据的组织的名称 4. 在组织设置页面上,单击 **Billing** 5. 在账单信息页面的“monthly bill”下,选择 **View Billing History** 6. 要查看单个收据,请找到要查看的收据行,然后在该行的右侧,单击查看图标 #### 下载收据 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,点击您要下载其账单收据的组织名称 4. 在组织设置页面上,单击 **Billing** 5. 在账单信息页面的“monthly bill”下,选择 **View Billing History** 6. 要下载单张收据,请找到要下载的收据所在行,然后单击该行右侧的 PDF 图标 7. 要下载多张收据,首先通过选择日期旁边的框来选择您要下载的收据。要选择所有收据,请选中“Date”标题旁边的复选框。然后点击 **Download Checked** #### 通过电子邮件发送收据 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您要通过电子邮件发送其帐单收据的组织的名称 4. 在组织设置页面上,单击 **Billing** 5. 在账单信息页面的“monthly bill”下,选择 **View Billing History** 6. 要通过电子邮件发送单个收据,请找到要下载的收据行,然后在该行的右侧,单击电子邮件图标 7. 要通过电子邮件发送多张收据,首先通过选择日期旁边的框来选择您希望下载的收据。要选择所有收据,请选中“Date”标题旁边的复选框。然后单击 **Email Checked** 8. 在电子邮件收据对话框中,填写“From”、“To”和“Message”字段 9. 点击 **Send** ### 更新组织付费方案 作为 npm Teams 订阅(付费组织方案)的所有者,您可以更新用于支付方案的信用卡。更新您的信用卡不会更改您的结算周期日期,新信用卡将在下一个结算周期收取费用。 > 注意:如果用于支付您的 npm Teams 订阅或您的付费组织方案的信用卡到期,或者我们无法从您的卡中收取费用,您有 9 天的宽限期来更新该卡。 #### 更新信用卡信息 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您要更改其信用卡信息的组织的名称 4. 在组织设置页面上,单击 **Billing** 5. 在“monthly bill”下,点击 **Edit Payment Info** 6. 在计费信息对话框中,输入您的计费信息 7. 点击 **Payment Info** 8. 在信用卡信息对话框中,输入您的信用卡信息 9. 要在 npm 上保存您的信用卡信息以用于其他付款,请选择“Remember me” 10. 点击 **Update Card** #### 更新账单收据电子邮件和额外收据信息 作为组织所有者,您可以更新用于收据的电子邮件地址,并为您的付费组织方案的收据添加额外信息,例如您的公司名称、增值税识别号或记录地址。更新的账单信息将立即出现在所有收据上。 > 注意:账单电子邮件仅用于收据,不需要与用于支付组织费用的人的电子邮件地址相匹配。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您要更改其账单回执信息的组织名称 4. 在组织设置页面上,单击 **Billing** 5. 在账单信息页面的“monthly bill”下,选择 **View Billing History** 6. 在帐单历史记录对话框的底部,单击“Receipt Settings” 7. 要在收据中添加公司名称、增值税号、记录地址或其他信息,请在“Extra Billing Information”文本框中输入信息 8. 要更新用于收据的电子邮件地址,请在“Send my receipts”旁边选中复选框并输入应接收帐单收据的电子邮件地址 9. 点击 **Save** ### 降级为免费组织方案 如果您是 npm Teams 产品的订阅者(您有一个付费组织)并且您是该组织的所有者,那么您可以从 npm Teams 降级为免费组织。当您从付费组织降级为免费组织时,您和您的组织成员将无法在最后一个付费结算周期结束时安装和发布私有包。当您降级到免费方案时,您的私人包将不会公开显示。 注意:如果您想为更少的组织成员付费,您可以按照“从组织中删除成员”中的步骤从组织中删除成员。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击要降级的组织的名称 4. 在组织设置页面上,单击 **Billing** 5. 在“change plan”下,单击 **Downgrade Plan** 6. 在“Are you sure?”下,点击 **Downgrade to a free account** ## 管理组织成员 ### 将成员添加到您的组织 作为组织所有者,您可以将其他 npm 用户添加到您的组织,以授予他们对您组织范围内的公共和私有包以及由您的组织管理的公共无范围包的读取或读写访问权限。 当您将成员添加到您的组织时,他们会收到一封邀请他们加入组织的电子邮件。 新成员接受邀请后,他们是: - 分配了“member”的角色 - 添加到“developers”团队 如果您有一个付费组织,作为 npm Teams 方案的一部分,您将每月为每个新成员支付 7 美元的费用。 #### 邀请成员加入您的组织 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Members** 5. 单击 **Invite Members** 6. 在“Username or email”字段中,输入您要邀请的人的用户名或电子邮件地址。或者,您可以选择一个特定的团队来邀请该成员 7. 点击 **Invite** #### 撤销组织邀请 作为组织所有者,如果您在邀请某人加入您的组织时出错,您可以撤消组织邀请。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Members** 5. 单击 **Invite Members** 6. 在“Invitations”字段下,单击您要撤消的用户邀请名称旁边的 X ### 接受或拒绝组织邀请 #### 接受组织邀请 如果您收到组织的邀请,则必须通过电子邮件接受邀请才能添加到该组织。 您可以选择使用与收到加入组织邀请的电子邮件地址不同的电子邮件地址。 1. 单击组织邀请电子邮件中的验证链接 2. 系统将提示您登录您的 npm 用户帐户。如果您没有 npm 用户帐户,您可以注册一个 #### 拒绝组织邀请 如果您被邀请加入您不想加入的组织,您可以让邀请过期。组织邀请会在一周后过期。 ### 组织角色和权限 组织中存在三个角色: - **Owner**:管理组织成员和付费的用户 - **Admin**:管理团队成员资格和包访问权限的用户 - **Member**:在组织范围内创建和发布包的用户 您不能从组织中删除最后一个所有者。 | 操作 | Owner | Admin | Member | | :----------------------: | :---: | :---: | :----: | | 负责组织的付费 | √ | | | | 将成员添加到组织 | √ | | | | 从组织中删除成员 | √ | | | | 重命名组织 | √ | | | | 删除组织 | √ | | | | 更改任何组织成员的角色 | √ | | | | 创建团队 | √ | √ | | | 删除团队 | √ | √ | | | 将任何成员添加到任何团队 | √ | √ | | | 从任何团队中删除任何成员 | √ | √ | | | 管理团队包访问 | √ | √ | | | 在组织范围内创建和发布包 | √ | √ | √ | ### 管理组织权限 作为组织所有者,您可以更改组织中任何成员的角色,以添加或删除该成员对组织的权限。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Members** 5. 在组织成员列表中,找到您要更改其角色的成员 6. 在成员行中,要选择组织成员的新角色,请单击 **member** 、 **admin** 或 **owner** ### 从您的组织中删除成员 作为组织所有者,如果成员在您的组织拥有或管理的包上协作的时间较长,您可以从组织中删除他们。 如果您从 npm Teams 订阅(付费组织)中删除成员,则他们将无法访问您组织的私有包,并且在下一个计费周期不会向您的组织存档的信用卡收取费用。 > 注意:当您从组织中删除成员时,不会通知成员。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Members** 5. 在组织成员列表中,找到您要移除的成员 6. 在成员行的末尾,单击 X ## 管理团队 ### 关于开发团队 “**developers**”团队是在您创建组织时自动创建的。默认情况下,开发团队对组织范围内创建的所有新包具有读/写访问权限。 - 添加到组织的成员(包括组织所有者)会自动添加到开发人员团队 - 组织范围内任何新创建的包的 package.json 中的维护者字段会自动填充当前开发团队的成员 如果您在组织范围内创建了一个新包,并且您不希望开发人员团队的成员拥有对该包的读/写访问权限,则所有者或管理员可以删除开发人员团队对该包的访问权限。 如果所有者将新成员添加到组织并且不希望该成员加入开发人员团队,则所有者可以将其删除。 > 注意:开发人员团队不能再从组织中移除,原因如下: > > - 它是组织中所有用户、包和默认权限的真实来源 > - 当您想要限制写入权限时,最好将默认权限设置为只读并创建单独的团队来管理写入权限 ### 创建团队 作为组织所有者或团队管理员,您可以创建团队来管理对由您的组织管理的包的访问。 > 注意:团队名称不能更改。要重命名团队,您必须删除该团队并重新创建它。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Teams** 5. 在“Name”和“Description”字段中,输入团队名称和有用的描述。团队名称必须小写且不能包含空格或标点符号 6. 点击 **Make it so** > 注意:默认情况下,新团队没有成员或包访问权限。创建团队后,从“团队”选项卡添加包和成员。 ### 将组织成员添加到团队 作为组织所有者或团队管理员,您可以将组织成员添加到团队,以授予他们访问由组织管理的特定包的访问权限。 > 注意:npm 用户必须是您组织的成员,您才能将其添加到团队中。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Teams** 5. 在您要添加成员的团队旁边,单击 **Members** 6. 在“Username”字段中,输入您要添加到团队的组织成员的 npm 用户名 7. 点击 **+ Add User** > 注意:将组织成员添加到团队时不会收到通知。我们建议告诉组织成员您已将他们添加到团队中。 #### 从 CLI 管理团队 如果您想从命令行界面 (CLI) 管理您的团队成员,您可以使用: ```shell npm team ``` ### 从团队中删除组织成员 作为组织所有者或团队管理员,如果组织成员不再需要访问团队可访问的包,您可以从团队中删除他们。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Teams** 5. 在团队成员列表中,找到您要移除的成员 6. 在成员行中,要从团队中删除成员,请单击 X > 注意:从团队中删除成员,即使该成员是他们唯一的成员,也不会将其从组织中删除。 ### 管理团队对组织包的访问权限 作为组织所有者或团队管理员,您可以向组织中的团队添加或删除包访问权限。 #### 将包访问权限添加到团队 ##### 在 Web 上为团队添加包访问权限 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Teams** 5. 在您要添加包访问权限的团队旁边,单击 **Packages** 6. 在“Add Packages”页面的“Package”字段中,输入包的名称并从下拉菜单中选择 7. 点击 **+ Add Existing Package** 8. 在包名称旁边,单击 **read** 或 **read/write** 以设置包的团队权限 ##### 使用 CLI 向团队添加包访问权限 作为组织所有者或团队管理员,您可以使用 CLI access 命令在命令行上将包访问权限添加到团队: ```shell npm access grant [] ``` #### 从团队中删除包访问权限 ##### 在 Web 上从团队删除包访问权限 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Teams** 5. 在您要删除包访问权限的团队旁边,单击 **Packages** 6. 在要删除访问权限的包的名称旁边,单击 x ##### 使用 CLI 从团队中删除包访问权限 作为组织所有者或团队管理员,您还可以使用 CLI access 命令在命令行上撤销团队的包访问权限: ```shell npm access revoke [] ``` #### 更改团队的包访问权限 ##### 在 Web 上更改团队的包访问权限 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Teams** 5. 在您要更改包访问权限的团队旁边,单击 **Packages** 6. 在包名称旁边,单击 **read** 或 **read/write** 以设置包的团队权限 ##### 使用 CLI 更改团队的包访问权限 作为组织所有者或团队管理员,您可以使用 CLI 更改团队的包访问权限: ```shell npm access ``` ### 删除团队 作为组织所有者或团队管理员,您可以删除不再需要访问由您的组织管理的包的团队。删除团队不会从您的组织中删除团队成员或包。 > 注意:如果您删除所有引用特定包的团队,它将成为孤立的,您将无法访问它。 1. 使用您的用户帐户登录到 npm 2. 在页面的右上角,单击您的头像,然后单击帐户 3. 在左侧边栏中,单击您的组织名称 4. 在组织设置页面上,单击 **Teams** 5. 在您要删除的团队名称旁边,单击 X > 注意:您不能删除 developers 团队。 ## 管理组织包 ### 关于组织范围和包 每个组织都被授予一个组织范围,即组织拥有的与组织名称匹配的包的唯一命名空间。例如,名为“wombat”的组织将具有@wombat 范围。 您可以使用范围来: - 维护一个包的分支:@wombat/request - 避免与流行名称发生名称争议:@wombat/web - 轻松找到同一命名空间中的包 范围内的包必须遵循与无范围包相同的命名准则。 #### 管理无范围包 虽然在创建组织时默认授予您一个范围,但您也可以使用组织来管理无范围的包或不同范围(例如用户范围)下的包。 ### 使用您的组织设置配置您的 npm 客户端 作为组织成员,您可以将 npm 客户端配置为: - 使您在本地创建的单个包或所有新包都使用您组织的范围 - 使您在本地创建的单个包或所有新包具有默认的公共可见性 #### 配置您的 npm 客户端以使用您组织的范围 如果您将经常发布具有组织范围的包,则可以将组织范围添加到全局 .npmrc 配置文件中。 ##### 为所有新包设置组织范围 > 注意:使用以下步骤设置组织范围只会设置新包的范围;对于现有包,您需要更新 package.json 中的 name 字段。 在命令行上,运行以下命令,将 org-name 替换为您的组织名称: ```shell npm config set scope --global ``` 对于您不想使用组织范围发布的包,您必须手动编辑包的 package.json 以从 name 字段中删除组织范围。 ##### 为单个包设置组织范围 1. 在命令行上,导航到包目录 2. 运行以下命令,将 org-name 替换为您的组织名称: ```shell npm config set scope ``` #### 将默认包可见性更改为公共 默认情况下,使用 npm publish 发布范围包会将包发布为私有。如果您是免费组织的组织成员,或者是付费组织但希望将范围包发布为公共,则必须传递 --access public 标志: ```shell npm publish --access public ``` ##### 将单个包的包可见性设置为公开 您可以将单个包设置为将 --access public 传递给您为该包发出的每个 npm publish 命令。 1. 在命令行上,导航到包目录 2. 运行以下命令: ```shell npm config set access public ``` ##### 将所有包的包可见性设置为公开 您可以将所有包设置为将 --access public 传递给您为该包发出的每个 npm publish 命令。 > 警告:在您的全局 .npmrc 中将包访问权限设置为 public 将影响您创建的所有包,包括您个人用户范围内的包,以及您组织范围内的包。 在命令行上,运行以下命令: ```shell npm config set access public --global ``` ### 创建和发布组织范围包 作为组织成员,您可以在组织范围内创建和发布公共和私有包。 #### 创建组织范围的包 1. 在命令行上,使用您要创建的包的名称创建一个目录 2. 导航到新创建的包目录 3. 要创建组织范围的包,请在命令行上运行: ```shell npm init --scope= ``` 4. 要验证包是否使用您的组织范围,请在文本编辑器中打开包的 package.json 文件并检查名称是否为 @your_org_name/pkg_name,将 your_org_name 替换为您的组织名称 #### 发布私有组织范围的包 默认情况下,npm publish 会将范围包以私有方式发布。 默认情况下,任何范围包都以私有方式发布。但是,如果您的组织没有 Private Packages 功能,则 npm publish 将失败,除非您传递访问标志。 1. 在命令行上,导航到包目录 2. 运行 npm publish 私有包将在 npm 网站上的包名称下方显示 private。 #### 发布公共组织范围的包 要将组织范围的包以公共方式发布,请使用 npm publish --access public。 1. 在命令行上,导航到包目录 2. 运行 npm publish --access public 公共包将在 npm 网站上的包名称下方显示 public。 # npm CLI ## CLI 命令 ### npm(javascript 包管理器) npm 是 Node JavaScript 平台的包管理器。它将模块放置到固定位置,以便 Node 可以找到它们,并智能地管理依赖冲突。 它具有极强的可配置性,可以支持各种用例。最常见的是,您使用它来发布、发现、安装和开发 Node 程序。 默认情况下,npm 配置使用 npm 官方源,并遵循官方政策。 您可以将 npm 配置为使用您喜欢的任何兼容注册表,甚至是您自己的注册表。使用他人的注册表需受其使用条款的约束。 如果一个包使用 Git URL 列出了一个依赖项,npm 将使用 git 命令安装该依赖项,如果没有安装 Git 将生成一个错误。 npm 有两种操作模式: - 本地模式:npm 将包安装到当前项目目录中,默认为当前工作目录。包安装到 ./node_modules,bins 到 ./node_modules/.bin - 全局模式:npm 将包安装到 $npm_config_prefix/lib/node_modules 中,bins 到 $npm_config_prefix/bin ### npm access(设置发布包的访问性) ```shell npm access public [] npm access restricted [] npm access grant [] npm access revoke [] npm access 2fa-required [] npm access 2fa-not-required [] npm access ls-packages [||] npm access ls-collaborators [ []] npm access edit [] ``` 对于所有子命令,如果没有将包名称传递给子命令,npm access 将对当前工作目录中的包执行操作。 - public / restricted:将包设置为可公开访问或受限制 - grant / revoke:添加或删除团队对包具有只读或读写访问权限的能力 - 2fa-required / 2fa-not-required:配置包是否要求发布它的任何人在其帐户上启用双重身份验证 - ls-packages:显示用户或组织或团队能够访问的所有包以及访问级别,只读公共包除外(它不会打印整个注册表列表) - ls-collaborators:显示包的所有访问权限。只会显示您至少具有读取权限的包的权限。如果传入 user,则列表仅过滤到用户恰好属于的团队 - edit:使用 $EDITOR 一次性设置包的访问权限 npm access 始终直接在当前源上运行,可使用 --registry=registry url 从命令行进行指定。 您必须具有设置包访问权限的权限: - 您是无范围或范围包的所有者 - 您是拥有范围的团队的成员 - 作为团队成员或直接作为所有者,您已获得包的读写权限 ### npm adduser(添加注册表用户帐户) ```shell npm adduser aliases: login, add-user ``` 注意:此命令不知道工作区。 在指定的注册表中注册或登录名为 username 的用户,并将凭据保存到 .npmrc 文件。如果未指定注册表,则将使用默认注册表(请参阅配置)。 npm login 是 adduser 的别名,其行为方式完全相同。 ### npm audit(运行安全审核) ```shell npm audit [fix] ``` 该命令将项目中配置的依赖项的描述提交到默认注册表,并要求报告已知漏洞。如果发现任何漏洞,则将计算影响和适当的补救措施。如果提供了 fix 参数,则补救措施将应用于包树。 如果没有发现漏洞,该命令将以 0 退出。 请注意,某些漏洞无法自动修复,需要人工干预或审查。另请注意,由于 npm audit fix 会在后台运行完整的 npm install,因此适用于 npm install 的所有配置也将适用于 npm audit fix,因此 npm audit fix --package-lock-only 之类的内容将按预期工作。 默认情况下,如果发现任何漏洞,审核命令将以非零代码退出。在命令中包含 --audit-level 参数以指定将导致命令失败的最低漏洞级别可能很有用。此选项不过滤报告输出,它只是更改命令的失败阈值。 ### npm bin(显示 npm bin 文件夹路径) ```shell npm bin ``` 打印 npm 将安装可执行文件的文件夹路径。 ### npm bugs(发现包的 issue URL) ```shell npm bugs [ [ ...]] alias: issues ``` 此命令尝试猜测包的错误跟踪 URL 或支持电子邮件的 mailto URL 的可能位置,然后尝试使用 --browser 配置参数打开它。如果没有提供包名,它将在当前文件夹中搜索一个 package.json 并使用 name 属性。 ### npm cache(操作包缓存) ```shell npm cache add npm cache add npm cache add npm cache add npm cache add @ npm cache clean [] npm cache ls [@] npm cache verify ``` 用于添加、列出或清理 npm 缓存文件夹。 ### npm ci(安装一个干净的项目) ```shell npm ci aliases: clean-install, ic, install-clean, isntall-clean ``` 此命令与 npm install 类似,不同之处在于它旨在用于自动化环境,例如测试平台、持续集成和部署——或任何您希望确保对依赖项进行全新安装的情况。 在以下情况下,npm ci 会明显更快: - 有一个 package-lock.json 或 npm-shrinkwrap.json 文件 - node_modules 文件夹丢失或为空 简而言之,使用 npm install 和 npm ci 的主要区别是: - 项目必须有一个现有的 package-lock.json 或 npm-shrinkwrap.json - 如果 package-lock.json 中的依赖项与 package.json 中的依赖项不匹配,npm ci 将退出并报错,而不是更新 package-lock.json - npm ci 一次只能安装整个项目:无法使用此命令添加单个依赖项 - 如果 node_modules 已经存在,它将在 npm ci 开始安装之前自动删除 - 它永远不会写入 package.json 或任何 package-lock.json :安装基本上是冻结的 ### npm config(管理 npm 配置文件) ```shell npm config set = [= ...] npm config get [ [ ...]] npm config delete [ ...] npm config list [--json] npm config edit alias: c ``` npm 从命令行、环境变量、npmrc 文件以及在某些情况下的 package.json 文件中获取其配置设置。 npm config 命令可用于更新和编辑本地和全局 npmrc 文件的内容。 ### npm dedupe(删除包树中的重复项) ```shell npm dedupe alias: ddp ``` 搜索本地包树并尝试通过将共用依赖项上移来简化整体结构,这样它们可以更有效地被多个依赖包共享。 例如,考虑这个依赖图: ```tex a +-- b <-- depends on c@1.0.x | `-- c@1.0.3 `-- d <-- depends on c@~1.0.9 `-- c@1.0.10 ``` 在这种情况下,npm dedupe 会将树转换为: ```tex a +-- b +-- d `-- c@1.0.10 ``` 由于 Node 模块查找的分层特性,b 和 d 都将通过树根级别的单个 c 包来满足它们的依赖关系。 在某些情况下,您可能有这样的依赖关系图: ```tex a +-- b <-- depends on c@1.0.x +-- c@1.0.3 `-- d <-- depends on c@1.x `-- c@1.9.9 ``` 在安装过程中,b 的 c@1.0.3 依赖项被放置在树的根目录中。尽管 c@1.0.3 可以满足 d 对 c@1.x 的依赖,但使用了较新的 c@1.9.0 依赖,因为 npm 默认支持更新,即使这样做会导致重复。 运行 npm dedupe 会导致 npm 记录重复依赖项并重新评估,删除嵌套的 c 模块,因为有根目录中的一个就足够了。 要在安装过程中就去重,请运行 npm install --prefer-dedupe 或 npm config set prefer-dedupe true。 如未传参,去重操作始终作用于整个树。 请注意,此操作会改变依赖关系树,但不会导致安装新模块。 注意:npm dedupe 永远不会更新项目 package.json 中直接依赖项的 semver 值,如果要更新 package.json 中的值,可以运行:npm update --save 代替。 ### npm deprecate(弃用包的某个版本) ```shell npm deprecate [@] ``` 此命令将更新包的 npm 注册表项,向所有尝试安装它的人提供弃用警告。 它适用于版本范围和特定版本,因此您可以执行以下操作: ```shell npm deprecate my-thing@"< 0.2.3" "critical bug fixed in v0.2.3" ``` 传递给此命令的 SemVer 范围被解释为包含预发布版本。例如: ```shell npm deprecate my-thing@1.x "1.x is no longer supported" ``` 在这种情况下,版本 my-thing@1.0.0-beta.0 也将被弃用。 ### npm diff(比较文件内容差异) ```shell npm diff [...] ``` 与其对应的 git diff 类似,此命令将打印发布到 npm 注册表的包的文件内容差异。 - npm diff --diff=spec-a --diff=spec-b 使用它们的注册表说明符比较两个包版本,例如:npm diff --diff=pkg@1.0.0 --diff=pkg@^2.0.0。也可以跨任何包的分支进行比较,例如:npm diff --diff=pkg@1.0.0 --diff=pkg-fork@1.0.0。 可以使用任何有效的规范,因此也可以比较目录或 git 存储库,例如: npm diff --diff=pkg@latest --diff=./packages/pkg。 这是一个比较注册表中名为 abbrev 的包的两个不同版本的示例: ```shell npm diff --diff=abbrev@1.1.0 --diff=abbrev@1.1.1 ``` 鉴于 npm 规范的灵活性,您还可以像使用 npm install 时一样定位本地目录或 git repos: ```shell npm diff --diff=https://github.com/npm/libnpmdiff --diff=./local-path ``` - npm diff(在包目录中,无参数): 如果包已发布到注册表,npm diff 将获取标记为 latest 的版本(可以使用 tag 选项配置此值)并继续比较该版本中存在的文件的内容与本地文件中的内容。 此工作流程为包作者提供了一种方便的方式,可以查看与该包的最新发布版本相比,哪些包跟踪文件已更改。 - npm diff --diff=pkg-name(在包目录中): 当使用单个包名(没有版本或标签说明符)作为参数时,npm diff 将以与 npm-outdated 类似的方式工作,并访问注册表以确定名为 pkg-name 的包的当前发布版本并满足其依赖声明的 semver-range。一旦知道特定版本,npm diff 将打印差异内容,将本地文件系统中找到的 pkg-name 的当前版本与注册表返回的特定版本进行比较。 当前已安装的名为 abbrev 的包: ```shell npm diff --diff=abbrev ``` - npm diff --diff=spec-a(在包目录中): 与仅使用单个包名称类似,如果您希望将已安装包的本地版本与 spec-a 中提供的特定版本/标签/semver-range 进行比较,也可以声明完整的版本说明符。 一个例子:假设 pkg@1.0.0 安装在当前 node_modules 文件夹中,运行: ```shell npm diff --diff=pkg@2.0.0 ``` 它实际上就是 npm diff --diff=pkg@1.0.0 --diff=pkg@2.0.0 的别名。 - npm diff --diff=semver-a [--diff=semver-b](在包目录中): 使用 npm diff 和 semver-valid 版本号是比较当前包的不同版本的简写。 它需要从包目录运行,这样对于名为 pkg 的包,运行 npm diff --diff=1.0.0 --diff=1.0.1 与运行 npm diff --diff=pkg@1.0.0 --diff=pkg@1.0.1 相同。 如果只提供了一个参数 version-a,则当前本地版本与该版本进行比较。 这是一个比较当前包的两个特定版本(已发布到配置的注册表中)的示例: ```shell npm diff --diff=1.0.0 --diff=1.1.0 ``` 请注意,tag 名称不是有效的 --diff 参数值,如果您希望与已发布的 tag 版本进行比较,则必须使用 pkg@tagname 语法。 ### npm dist-tag(修改包的 tag) ```shell npm dist-tag add @ [] npm dist-tag rm npm dist-tag ls [] alias: dist-tags ``` ### npm docs(在 Web 浏览器中打开包的文档) ```shell npm docs [ [ ...]] alias: home ``` 此命令尝试猜测包文档 URL 的可能位置,然后尝试使用 --browser 配置参数打开它。您可以一次传递多个包名称。如果没有提供包名,它将在当前文件夹中搜索一个 package.json 并使用 name 属性。 ### npm doctor(检查你的 npm 环境) ```shell npm doctor ``` ### npm edit(编辑已安装的包) ```shell npm edit [/...] ``` 在当前项目中选择一个依赖项并在默认编辑器中打开包文件夹。 在它被编辑保存之后,项目被重新构建,以便获取编辑包中的任何更改。 例如,您可以执行 npm install connect 将 connect 安装到您的项目中,然后 npm edit connect 对您本地安装的副本进行一些更改。 ### npm exec(从本地或远程 npm 包运行命令) ```shell npm exec -- [@] [args...] npm exec --package=[@] -- [args...] npm exec -c ' [args...]' npm exec --package=foo -c ' [args...]' alias: x ``` 此命令允许您在与通过 npm run 运行类似的环境中从 npm 包(本地安装或远程获取)运行任意命令。 ### npm explain(解释已安装的包) ```shell npm explain alias: why ``` 此命令将打印当前项目中安装的包的依赖链。 位置参数可以是 node_modules 中的文件夹路径,也可以是 name@version-range 说明符,它将选择要解释的依赖关系。 例如,在 npm 的源代码树中运行 npm explain glob 将显示: ```tex glob@7.1.6 node_modules/glob glob@"^7.1.4" from the root project glob@7.1.1 dev node_modules/tacks/node_modules/glob glob@"^7.0.5" from rimraf@2.6.2 node_modules/tacks/node_modules/rimraf rimraf@"^2.6.2" from tacks@1.3.0 node_modules/tacks dev tacks@"^1.3.0" from the root project ``` 要仅解释驻留在特定文件夹中的包,请将其作为参数传递给命令。当试图弄清楚为什么要复制给定的依赖项以满足项目中冲突的版本要求时,这可能很有用。 ```shell $ npm explain node_modules/nyc/node_modules/find-up find-up@3.0.0 dev node_modules/nyc/node_modules/find-up find-up@"^3.0.0" from nyc@14.1.1 node_modules/nyc nyc@"^14.1.1" from tap@14.10.8 node_modules/tap dev tap@"^14.10.8" from the root project ``` ### npm explore(浏览已安装的包) ```shell npm explore [ -- ] ``` 在指定的已安装包的目录中生成一个子shell。 如果指定了命令,则它在子shell 中运行,然后立即终止。 这在 node_modules 文件夹中的 git 子模块的情况下特别方便: ```shell npm explore some-dependency -- git pull origin master ``` 请注意,该包不会在之后自动重新构建,因此如果您进行任何更改,请务必使用 npm rebuild pkg。 ### npm find-dupes(在包树中查找重复项) ```shell npm find-dupes ``` 在 --dry-run 模式下运行 npm dedupe,使 npm 仅输出重复项,而不实际更改包树。 ### npm fund(检索资金信息) ```shell npm fund [[<@scope>/]] ``` 此命令检索有关如何为给定项目的依赖项提供资金的信息。如果没有提供包名,它将以树形结构列出所有正在寻找资金的依赖项,列出资金的类型和要访问的 url。如果提供了包名称,那么它会尝试使用 --browser 配置参数打开其资金 URL;如果软件包有多个资金来源,将指示用户通过 --which 选项来消除歧义。 该列表将避免重复条目,并将所有共享相同 url 的包堆叠为单个条目。因此,该列表与 npm ls 的输出形状不同。 ### npm help(获取有关 npm 的帮助) ```shell npm help [] alias: hlep ``` 如果提供了主题,则显示相应的文档页面。 如果主题不存在,或者提供了多个术语,则 npm 将运行 help-search 命令来查找匹配项。请注意,如果 help-search 找到单个主题,那么它将针对该主题运行帮助,因此唯一匹配等同于指定主题名称。 ### npm help-search(搜索 npm 帮助文档) ```shell npm help-search ``` 此命令将在 npm markdown 文档文件中搜索提供的术语,然后列出结果,按相关性排序。 如果只找到一个结果,那么它将显示该帮助主题。 如果 npm help 的参数不是已知的帮助主题,那么它将调用 help-search。很少需要直接调用此命令。 ### npm hook(管理注册表 hook) ```shell npm hook add [--type=] npm hook ls [pkg] npm hook rm npm hook update ``` 允许您管理 npm hook,包括添加、删除、列出和更新。 hook 允许您配置 URL 端点,只要任何受支持的实体类型发生更改,就会通知这些端点。钩子可以监视三种不同类型的实体:包、所有者和范围。 要创建包 hook,只需引用包名称。 要创建所有者 hook,请在所有者名称前加上 ~(如 ~youruser)。 要创建范围 hook,请在范围名称前加上 @(如 @yourscope)。 update 和 rm 使用的钩子 id 是在 npm hook ls 中为该特定钩子列出的 ID。 共享密钥将被发送到 URL 端点,因此您可以验证请求来自您自己配置的钩子。 ### npm init(创建一个 package.json 文件) ```shell npm init [--force|-f|--yes|-y|--scope] npm init <@scope> (same as `npx <@scope>/create`) npm init [<@scope>/] (same as `npx [<@scope>/]create-`) aliases: create, innit ``` npm init initializer 可用于设置新的或现有的 npm 包。 在这种情况下,initializer 是一个名为 create-initializer 的 npm 包,它将由 npm-exec 安装,然后执行其主 bin ——大概是创建或更新 package.json 并运行任何其他与初始化相关的操作。 init 命令转化为对应的 npm exec 操作如下: - `npm init foo` - `npm exec create-foo` - `npm init @usr/foo` - `npm exec @usr/create-foo` - `npm init @usr` - `npm exec @usr/create` 如果初始化器被省略(通过调用 npm init),init 将回退到旧的 init 行为。它会问你一堆问题,然后为你写一个 package.json。它将尝试根据现有字段、依赖项和选择的选项进行合理的猜测。它是严格附加的,因此它将保留已设置的所有字段和值。您也可以使用 -y/--yes 完全跳过问卷。如果你通过 --scope,它将创建一个范围包。 注意:如果用户已经全局安装了 create-initializer 包,那将是 npm init 使用的。如果您希望 npm 使用最新版本或其他特定版本,您必须指定它: - npm init foo@latest # 从注册表中获取并运行最新的 create-foo - npm init foo@1.2.3 # 专门运行 create-foo@1.2.3 任何其它选项都将直接传递给命令,因此 npm init foo -- --hello 将映射到 npm exec -- create-foo --hello。 为了更好地说明选项是如何转发的,这里有一个更高级的示例,显示了传递给 npm cli 和 create 包的选项,以下两个命令是等效的: - `npm init foo -y --registry= -- --hello -a` - `npm exec -y --registry= -- create-foo --hello -a` 使用 create-react-app 创建一个新的基于 React 的项目: ```shell $ npm init react-app ./my-react-app ``` 使用 create-esm 创建一个新的 esm 兼容包: ```shell $ mkdir my-esm-lib && cd my-esm-lib $ npm init esm --yes ``` 使用旧版 init 生成一个普通的旧 package.json: ```shell $ mkdir my-npm-pkg && cd my-npm-pkg $ git init $ npm init ``` 生成它而不让它问任何问题: ```shell $ npm init -y ``` ### npm install(安装包) ```shell npm install [<@scope>/] npm install [<@scope>/]@ npm install [<@scope>/]@ npm install [<@scope>/]@ npm install @npm: npm install npm install npm install npm install npm install / aliases: add, i, in, ins, inst, insta, instal, isnt, isnta, isntal, isntall ``` 此命令安装一个包和它所依赖的任何包。如果包有一个 `package-lock.json`,或者一个 `npm-shrinkwrap.json`,或者一个`yarn.lock`,依赖项的安装将由它们驱动,遵循以下优先顺序: - `npm-shrinkwrap.json` - `package-lock.json` - `yarn.lock` 一个包是: - a) 包含由 package.json 文件描述的程序的文件夹 - b) 一个 gzipped tarball,包含 (a) - c) 解析为 (b) 的 url - d) 一个 name@version 与 (c) 一起在注册表(参见注册表)上发布 - e) 一个指向 (d) 的 name@tag(参见 npm dist-tag) - f) 具有满足 (e) 的“latest”标签的 name - g) 解析为 (a) 的 git remote url 即使你从不发布你的包,如果你只是想写一个 Node 程序(a),你仍然可以获得使用 npm 的很多好处,也许你还想在将它打包成一个 tarball (b)后能够轻松地安装它。 - npm install(在包目录中,无参数): 将依赖项安装到本地 node_modules 文件夹。 在全局模式下(即,将 -g 或 --global 附加到命令中),它将包安装为全局包。 默认情况下,npm install 将安装 package.json 中列为 dependencies 的所有模块。 使用 --production 标志(或者当 NODE_ENV 环境变量设置为 production 时),npm 将不会安装 devDependencies 中列出的模块。要在 NODE_ENV 环境变量设置为 production 时安装 dependencies 和 devDependencies 中列出的所有模块,可以使用 --production=false。 > 注意:在向项目添加依赖项时,--production 标志没有特殊含义。 - npm install folder: 如果 folder 位于项目的根目录中,它的依赖项将被安装,并且可能会像其它类型的依赖项一样被提升到顶级 node_modules。如果 folder 位于项目的根目录之外,npm 将不会在目录 folder 中安装包依赖项,但它会创建一个指向 folder 的链接。 > 注意:如果您想从注册表安装目录的内容(如包)而不是创建链接,则需要使用 --install-links 选项。 - npm install tarball file: 安装位于文件系统上的包。注意:如果您只想将 dev 目录链接到您的 npm 根目录,您可以使用 npm link 更轻松地做到这一点。 压缩包要求: - 文件名必须使用 .tar、.tar.gz 或 .tgz 作为扩展名 - 包内容应位于压缩包内的子文件夹中(通常称为 package/)。 npm 在安装包时剥离一个目录层(相当于 tar x --strip-components=1 运行) - 包必须包含一个带有 name 和 version 属性的 package.json 文件 - npm install tarball url: 获取 tarball url,然后安装它。为了区分此选项和其他选项,参数必须以“http://”或“https://”开头 - npm install [@scope/]name: 执行 name@tag 安装,其中 tag 是标签配置(配置的默认值是 latest) npm install 默认情况下将任何指定的包保存到 dependencies 中。此外,您可以使用一些额外的标志来控制它们的保存位置和方式: - -P, --save-prod:包将出现在您的 dependencies 中。这是默认值,除非存在 -D 或 -O - -D, --save-dev:包将出现在您的 devDependencies 中 - -O, --save-optional:包将出现在您的 optionalDependencies 中 - --no-save:防止保存到 dependencies 当使用上述任何选项将依赖项保存到 package.json 时,还有两个额外的可选标志: - -E, --save-exact:保存的依赖项将使用精确的版本进行配置,而不是使用 npm 的默认 semver 范围 - -B, --save-bundle:保存的依赖项也将添加到您的 bundleDependencies 中 此外,如果您有 npm-shrinkwrap.json 或 package-lock.json,那么它们也会被更新。 scope 是可选的。该包将从与指定范围关联的注册表中下载。如果没有注册表与给定范围关联,则假定为默认注册表。 注意:如果你的范围名称中没有包含 @,npm 会将其解释为 GitHub 存储库,范围名称后还必须跟一个斜杠。 ```shell npm install sax npm install githubname/reponame npm install @myorg/privatepackage npm install node-tap --save-dev npm install dtrace-provider --save-optional npm install readable-stream --save-exact npm install ansi-regex --save-bundle ``` 注意:如果当前工作目录中有一个名为 name 的文件或文件夹,那么它将尝试安装该文件或文件夹,如果它无效,则仅尝试按名称获取包。 - npm install alias@npm:name: ```shell npm install my-react@npm:react npm install jquery2@npm:jquery@2 npm install jquery3@npm:jquery@3 npm install npa@npm:npm-package-arg ``` - npm install [@scope/]name@tag: 安装指定 tag 引用的包的版本。如果该包的注册表数据中不存在该 tag,则此操作将失败。 ```shell npm install sax@latest npm install @myorg/mypackage@latest ``` - npm install [@scope/]name@version: 安装指定版本的包。如果版本尚未发布到注册表,这将失败。 ```shell npm install sax@0.1.1 npm install @myorg/privatepackage@1.5.0 ``` - npm install [@scope/]name@version range: 安装与指定版本范围匹配的包的版本。这将遵循 package.json 中描述的解析依赖项版本范围的相同规则。 请注意,大多数版本范围必须放在引号中,以便您的 shell 将其视为单个参数。 ```shell npm install sax@">=0.1.0 <0.2.0" npm install @myorg/privatepackage@"16 - 17" ``` - npm install git remote url: 从托管的 git 地址安装包,并使用 git 下载它。对于完整的 git 远程 URL,只会尝试该 URL。 ```shell ://[[:]@][:][:][/][# | #semver:] ``` - npm install githubname/githubrepo[#commit-ish] - npm install github:githubname/githubrepo[#commit-ish] - npm install gist:[githubname/]gistId[#commit-ish|#semver:semver] - npm install bitbucket:bitbucketname/bitbucketrepo[#commit-ish] - npm install gitlab:gitlabname/gitlabrepo[#commit-ish] 您可以组合多个参数,甚至多种类型的参数。例如: ```shell npm install sax@">=0.1.0 <0.2.0" bench supervisor ``` --tag 参数将应用于所有指定的安装目标。如果存在具有给定名称的 tag,则 tag 的版本优先于较新的版本。 --dry-run 参数将以通常的方式报告在没有实际安装任何东西的情况下安装操作会完成的工作。 --package-lock-only 参数只会更新 package-lock.json,而不是检查 node_modules 和下载依赖项。 -f 或 --force 参数将强制 npm 获取远程资源,即使磁盘上存在本地副本。 ### npm install-ci-test(安装一个干净的项目并运行测试) ```shell npm install-ci-test alias: cit ``` 此命令运行 npm ci,然后立即运行 npm test ### npm install-test(安装包并运行测试) ```shell npm install-test [<@scope>/] npm install-test [<@scope>/]@ npm install-test [<@scope>/]@ npm install-test [<@scope>/]@ npm install-test @npm: npm install-test npm install-test npm install-test npm install-test npm install-test / alias: it ``` 此命令运行 npm install,然后立即运行 npm test。它采用与 npm install 完全相同的参数。 ### npm link(链接包文件夹) ```shell npm link (in package dir) npm link [<@scope>/][@] alias: ln ``` 这对于安装你自己的东西很方便,这样你就可以在它上面工作和迭代测试,而不必不断地重新构建。 npm link 有两步过程。 首先,包文件夹中的 npm link 将在全局文件夹 {prefix}/lib/node_modules/package 中创建一个链接,链接到执行 npm link 命令的包。它还将包中的任何 bin 链接到 {prefix}/bin/{name}。请注意,npm link 使用全局前缀(请参阅 npm prefix -g 的值)。 接下来,在其它位置,npm link package 将创建一个从全局安装的 package 到当前文件夹的 node_modules/ 的链接。 请注意,package 取自 package.json,而不是目录名称。 包名称可以选择以范围为前缀。 在创建 tarball 时,如果链接包被包含在 bundleDependencies 中,则通过解析链接将链接包“快照”到它们的当前状态。 ```shell cd ~/projects/node-redis # go into the package directory npm link # creates global link cd ~/projects/node-bloggy # go into some other package directory. npm link redis # link-install the package ``` 现在,对 ~/projects/node-redis 的任何更改都将映射在 ~/projects/node-bloggy/node_modules/node-redis/ 中。请注意,链接应该指向包名称,而不是该包的目录名称。 您也可以将这两个步骤合二为一。例如,以更短的方式执行上述用例: ```shell cd ~/projects/node-bloggy # go into the dir of your main project npm link ../node-redis # link the dir of your dependency ``` 第二行相当于做: ```shell (cd ../node-redis; npm link) npm link redis ``` 也就是说,它首先创建一个全局链接,然后将全局安装目标链接到您项目的 node_modules 文件夹中。 请注意,默认情况下,以这种方式链接的包依赖项不会保存到 package.json,假设目的是让链接包代替常规的非链接依赖项。例如,如果您依赖 redis@^3.0.1,并运行 npm link redis,它将用 file:../path/to/node-redis 替换 ^3.0.1 的依赖项,而您可能不想要这样做!此外,如果您项目中的其他用户或开发人员的文件夹设置与您的文件夹不完全相同,他们也会遇到问题。 如果要将新依赖项作为链接添加,则应通过运行 npm install dep --package-lock-only 将其添加到相关元数据中。 如果你想保存 file: 链接在你的 package.json 和 package-lock.json 文件中,你可以使用 npm link dep --save。 ### npm logout(退出登录) ```shell npm logout ``` 登录到支持基于令牌的身份验证的注册表时,告诉服务器结束此令牌的会话。这将使令牌在您使用它的任何地方都无效,而不仅仅是当前环境。 当登录到使用用户名和密码身份验证的旧注册表时,这将清除用户配置中的凭据。在这种情况下,它只会影响当前环境。 如果提供了 --scope,这将找到连接到该范围的注册表的凭据(如果已设置)。 ### npm ls(列出已安装的包) ```shell npm ls [[<@scope>/] ...] alias: list ``` ### npm org(管理组织) ```shell npm org set orgname username [developer | admin | owner] npm org rm orgname username npm org ls orgname [] alias: ogr ``` ### npm outdated(检查过时的包) ```shell npm outdated [[<@scope>/] ...] ``` 此命令将通过访问注册表以查看当前是否有任何(或特定)已安装的包已过时。 默认情况下,仅显示根项目的直接依赖项和配置的工作区的直接依赖项。使用 --all 也可以查找所有过时的元依赖项。 ### npm owner(管理包所有者) ```shell npm owner add [<@scope>/] npm owner rm [<@scope>/] npm owner ls [<@scope>/] alias: author ``` ### npm pack(从包中创建一个 tarball) ```shell npm pack [[<@scope>/]...] ``` ### npm ping(ping npm 注册表服务) ```shell npm ping ``` ### npm pkg(管理你的 package.json) ```shell npm pkg set = [= ...] npm pkg get [ [ ...]] npm pkg delete [ ...] npm pkg set [[].= ...] npm pkg set [[].= ...] ``` 自动管理 package.json 文件的命令。 npm pkg 提供 3 个不同的子命令,允许您修改或检索 package.json 中给定对象键的值。 ### npm prefix(显示前缀) ```shell npm prefix [-g] ``` 将本地前缀打印到标准输出。这是包含 package.json 文件或 node_modules 目录的最近父目录,除非还指定了 -g。 如果指定了 -g,这将是全局前缀的值。 ### npm profile(更改个人设置) ```shell npm profile enable-2fa [auth-only|auth-and-writes] npm profile disable-2fa npm profile get [] npm profile set ``` ### npm prune(删除多余的包) ```shell npm prune [[<@scope>/]...] ``` 此命令删除“无关”包。如果提供了包名称,则仅删除与提供的名称之一匹配的包。 无关的包是存在于 node_modules 文件夹中的那些未列为任何包的依赖项列表的包。 ### npm publish(发布包) ```shell npm publish [] ``` 将包发布到注册表,以便可以按名称安装。 ### npm rebuild(重新构建包) ```shell npm rebuild [[<@scope>/][@] ...] alias: rb ``` ### npm repo(在浏览器中打开包仓库页面) ```shell npm repo [ [ ...]] ``` 此命令尝试猜测包的仓库 URL 的可能位置,然后尝试使用 --browser 配置参数打开它。如果没有提供包名,它将在当前文件夹中搜索 package.json 并使用 repository 属性。 ### npm restart(重启一个包) ```shell npm restart [-- ] ``` 这将重新启动一个项目。相当于运行 npm run-script restart。 如果当前项目在 package.json 中指定了“restart”脚本,则将运行以下脚本: 1. prerestart 2. restart 3. postrestart 如果它没有指定“restart”脚本,但它确实有 stop 和/或 start 脚本,那么将运行以下脚本: 1. prerestart 2. prestop 3. stop 4. poststop 5. prestart 6. start 7. poststart 8. postrestart ### npm root(显示 npm 根目录) ```shell npm root ``` ### npm run-script(运行包脚本) ```shell npm run-script [-- ] aliases: run, rum, urn ``` 这会从包的“scripts”对象运行脚本。如果没有提供“command”,它将列出可用的脚本。 run[-script] 由 test、start、restart 和 stop 命令使用,但也可以直接调用。当包中的脚本被打印出来时,它们被分为生命周期(测试、启动、重启)和直接运行的脚本。 任何位置参数都会传递给指定的脚本。使用 -- 传递 --prefixed 标志和选项,否则它们会被 npm 解析。 ```shell npm run test -- --grep="pattern" ``` 参数只会传递给 npm run 之后指定的脚本,而不是任何 pre 或 post 脚本。 env 脚本是一个特殊的内置命令,可用于列出脚本在运行时可用的环境变量。如果在您的包中定义了“env”命令,它将覆盖内置命令。 除了 shell 预先存在的 PATH 之外,npm run 还将 node_modules/.bin 添加到提供给脚本使用的 PATH 中。本地安装的依赖项提供的任何二进制文件都可以在没有 node_modules/.bin 前缀的情况下使用。例如,如果你的包中有一个 devDependency tap,你应该写: ```shell "scripts": {"test": "tap test/*.js"} ``` 脚本从包文件夹的根目录运行,无论调用 npm run 时当前工作目录是什么。如果您希望脚本根据您所在的子目录使用不同的行为,您可以使用 INIT_CWD 环境变量,它保存您在运行 npm run 时所在的完整路径。 npm run 将 Node 环境变量提供给由 npm 调用的 Node 进程使用。 ### npm search(搜索包) ```shell npm search [search terms ...] aliases: find, s, se ``` 在注册表中搜索与搜索词匹配的包。 npm search 通过包元数据对注册表中的所有文件执行线性、增量、词法排序的搜索。如果您的终端支持颜色,它将进一步突出显示结果中的匹配项。这可以通过配置项 color 禁用。 ### npm set-script(在 package.json 的脚本部分设置任务) ```shell npm set-script [