Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
开发人员可以使用 Azure Artifacts 管理来自各种源的包,包括公共注册表(如 npmjs.com)和私有源。 若要使用 Azure Artifacts 进行身份验证,需要配置 npm 配置文件。 此文件包含 npm 使用的源 URL 和凭据,提供自定义 npm 客户端行为的选项,例如设置代理、定义默认包位置或配置专用包源。
npmrc 文件通常位于用户的主目录中,但也可在项目级别创建以替代默认设置。
先决条件
连接到源
Azure Artifacts 建议使用两个单独的配置文件。 第一个专用于使用 Azure Artifacts 进行身份验证,而第二个应保存在本地以存储凭据。 此方法允许你在确保凭据安全的同时共享配置文件。
若要设置第二个文件,请将该文件放在开发计算机上的主目录中,并包括所有注册表凭据。 这使 npm 客户端可以轻松访问您的凭据以进行身份验证。
以下步骤将指导你设置第一个配置文件。 选择与开发环境对应的选项卡:
备注
Azure DevOps Server 不支持 vsts-npm-auth
。
登录到 Azure DevOps 组织,然后导航到项目。
选择工件,然后选择连接到源。
从左侧边栏中选择 npm。 如果这是首次将 Azure Artifacts 与 npm 配合使用,请确保已安装必备组件。
按照项目设置部分中的说明连接到源。
将 .npmrc 文件添加到项目的目录中、package.json 文件所在的同一目录中,并将以下代码片段粘贴到其中。
registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/
always-auth=true
设置凭据
复制以下代码片段并将其粘贴到用户级 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
使用打包读取和写入作用域生成个人访问令牌。
在命令提示符窗口中运行以下命令,然后在出现提示时粘贴个人访问令牌。 完成后,复制生成的 Base 64 编码值。
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(); })"
如果使用的是 Linux/Mac,则可以使用以下命令将个人访问令牌转换为 Base 64。 复制生成的 Base64 编码值。
echo -n "YOUR_PERSONAL_ACCESS-TOKEN" | base64
将用户 .npmrc 文件中的占位符 [BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] 替换为从上一步获取的编码个人访问令牌。
登录到 Azure DevOps 集合,然后导航到项目。
选择工件,然后选择连接到源。
从左侧栏中选择 npm,然后按照 项目设置 部分中的说明设置配置文件。
将 .npmrc 文件添加到项目的目录中、package.json 文件所在的同一目录中,并将以下代码片段粘贴到其中。
registry=http://<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/
always-auth=true
设置凭据
复制以下代码片段并将其粘贴到用户级 .npmrc 文件中:
集合作用域的源:
; begin auth token
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=DefaultCollection
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/:username=DefaultCollection
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value
; end auth token
项目作用域的源:
; begin auth token
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING]
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING]
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value
; end auth token
使用打包读取和写入作用域生成个人访问令牌。
在命令提示符窗口中运行以下命令,然后在出现提示时粘贴个人访问令牌。 完成后,复制生成的 Base 64 编码值。
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] 替换为从上一步获取的编码个人访问令牌。
登录到 Azure DevOps 集合,然后导航到项目。
选择工件,然后选择连接到源。
从左侧选择 npm,然后按照 项目设置 中的说明来配置您的配置文件。
将 .npmrc 文件添加到项目的目录中、package.json 文件所在的同一目录中,并将以下代码片段粘贴到其中:
registry=http://<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/
always-auth=true
备注
对于 Debian、Ubuntu,以及其他社区或企业分发版,例如 Fedora 或 Redhat,请确保已安装NodeSource 分发存储库中的先决条件。
设置凭据
复制以下代码片段并将其粘贴到用户级 .npmrc 文件中:
集合作用域的源:
; begin auth token
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=DefaultCollection
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/:username=DefaultCollection
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
//<SERVER_NAME>/<COLLECTION_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value
; end auth token
项目作用域的源:
; begin auth token
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING]
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING]
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
//<SERVER_NAME>/<COLLECTION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value
; end auth token
使用打包读取和写入作用域生成个人访问令牌。
在命令提示符窗口中运行以下命令,然后在出现提示时粘贴个人访问令牌。 完成后,复制生成的 Base 64 编码值。
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 文件中,可以使用多个注册表,这种支持适用于 范围 和 上游源。
故障排除
vsts-npm-auth 无法识别
此错误表示尚未将 npm modules 文件夹添加到路径。 重新运行 Node.js 设置,并确保选择 Add to PATH
选项。 或者,可以通过将 PATH 变量修改为命令提示符中的 %APPDATA%\npm
或在 PowerShell 中 $env:APPDATA\npm
,将 npm modules 文件夹添加到路径。
无法进行身份验证
重置 vsts-npm-auth
请按照以下步骤重设您的 vsts-npm-auth 凭据:
卸载 vsts-npm-auth:
npm uninstall -g vsts-npm-auth
清除 npm 缓存:
npm cache clean --force
删除 .npmrc 文件。
重新安装 vsts-npm-auth:
npm install -g vsts-npm-auth --registry https://registry.npmjs.com --always-auth false
无法发布
如果遇到 403 错误,则可能表示名称冲突。 在 Azure Artifacts 中,包是不可变的,这意味着一旦将包发布到您的包源后,其版本号将被永久保留并不能更改。 即使删除了它,也不能发布具有相同版本号的新包。 若要解决此问题,请更新 package.json 文件中的包版本,然后重试。
相关内容