在 Azure Artifacts 中使用 Npm 范围
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Npm 范围用作将相关包分类为组的方法。 通过这些范围,可以创建与不同用户创建的名称相同的包,而不会遇到冲突。 通过使用范围,可以通过添加范围前缀 @scopeName 和配置 .npmrc 文件来专门使用具有该特定范围的源来隔离公共包和专用包。
Azure Artifacts 提供从源或公共注册表发布和下载作用域内包和非作用域包的功能。 使用缺少 Internet 访问权限的自承载本地服务器时,Npm 范围特别有用,因为在这种情况下配置上游源是不可行的。 总之,使用范围时:
- 我们不必担心名称冲突。
- 无需更改 npm 注册表即可安装或发布包。
- 每个 npm 组织/用户都有自己的范围,只有所有者或作用域成员才能将包发布到其范围。
项目设置
登录到 Azure DevOps 组织,并导航到你的项目。
选择“项目”,然后选择连接源。
选择 npm,然后选择“ 其他”。
.npmrc
将文件添加到与package.json相同的目录中,并将以下代码片段粘贴到文件中。组织范围的源:
registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
项目范围的源:
registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
设置凭据
将以下代码片段复制到用户级
.npmrc
文件中(示例:C:\Users\FabrikamUser.npmrc)。 请确保不要将其粘贴到源存储库中的 .npmrc 文件中。组织范围的源:
; begin auth token //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:username=[ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value ; end auth token
项目范围的源:
; begin auth token //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value ; end auth token
运行以下命令,对新生成的个人访问令牌进行编码。 出现提示时,粘贴个人访问令牌,然后复制生成的 Base64 编码值。
node -e "require('readline') .createInterface({input:process.stdin,output:process.stdout,historySize:0}) .question('PAT> ',p => { b64=Buffer.from(p.trim()).toString('base64');console.log(b64);process.exit(); })"
.npmrc
打开文件,并将占位符[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
替换为刚刚创建的编码的个人访问令牌。
范围设置
在 .npmrc 文件中,替换为 registry=<YOUR_SOURCE_URL>
@ScopeName:registry=<YOUR_SOURCE_URL>
。
请确保在package.json文件中同时包含作用域和包名称,如下所示: { "name": "@ScopeName/PackageName" }
参阅下面的示例:
组织范围的源:
@ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
{ "name": "@ScopeName/PackageName" }
项目范围的源:
@ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
{ "name": "@ScopeName/PackageName" }
示例:
@local:registry=https://pkgs.dev.azure.com/FabrikamOrg/NpmDemo/_packaging/FabrikamFeed/npm/registry/ always-auth=true
{ "name": "@demo/js-e2e-express-server", "version": "2.0.0", "description": "JavaScript server written with Express.js", "main": "index.js", "directories": { "doc": "docs", "test": "test" }
发布作用域包
打开命令提示符窗口,导航到项目目录,并运行以下命令来发布限定范围的包。 在我们的示例中,包列在 @local 视图下。
npm publish
上游源与范围
上游源使你能够最灵活地在源中使用作用域内和非作用域包的组合,以及公共注册表中的作用域包和非作用域包(如 npmjs.com)。
但是,作用域对包施加命名限制:每个包名称必须以 @<scope>
开头。 如果要将专用包发布到公共注册表,则必须在作用域保持不变的情况下执行此操作。 如果在部署包时删除包范围,则需要更新package.json文件中的所有引用。 考虑到这一点,范围可以作为上游源的可行替代方法。