.npmrc
我有一个带有私有 npm 注册 URL 的项目级别
registry=https://blabla.pkgs.visualstudio.com/_packaging/BlaBla/npm/registry/
always-auth=true
我的 Azure 管道有此阶段,使用其内置任务进行 npm 安装
- task: Npm@1
displayName: "NPM Install"
inputs:
command: custom
workingDir: ./project/ #this is the project folder, has package.json, npmrc files
customCommand: install
verbose: true
现在一切正常,软件包也已安装。我认为身份验证令牌存储在某个全局 .npmrc 文件中
问题
由于合规性问题,我无法存储硬编码的 URL,.npmrc
因为它已被提交并被代码分析工具扫描和投诉。
我尝试以
某种方式将其设置为环境变量
方法 1
我编辑了我的项目级别
npmrc
registry=$REGISTRY
always-auth=true
并在安装之前写了一个 bash 阶段
- bash: |
export NPM_CONFIG_REGISTRY=https://blabla.pkgs.visualstudio.com/_packaging/BlaBla/npm/registry/
echo $NPM_CONFIG_REGISTRY #hardcoded in pipeline for testing
displayName: "Set NPM Registry"
workingDir: $(Build.SourcesDirectory)/project/
这在管道中不起作用,并给出了npm ERR! code ERR_INVALID_URL
。
当我在本地尝试时,它似乎全局添加了注册表 URL,因为当我使用npm config get registry
它进行测试时,打印了 URL,我只是在项目文件夹级别(具有项目级别 npmrc)和项目文件夹外部设置了 URL。我还测试了 URL 是否硬编码,并npm config get registry
在项目文件夹中打印了正确的 URL,并在项目文件夹外部打印了https://registry.npmjs.org/
。但在本地它npm install
可以工作,但可能是由于错误的原因,因为它也给出了这个
npm WARN invalid config registry="$REGISTRY" set in C:\BlaBla\project\.npmrc
npm WARN invalid config Must be full url with "http://"
因此,总而言之,我认为项目级注册表 URL 从未在本地设置过,但我不知道为什么 Azure 管道甚至没有这么接近。我猜是因为 Npm 任务在不同的终端/会话中运行,所以它不知道我刚刚设置的环境变量
- 方法 2
我没有设置环境,而是编辑了安装自定义命令
customCommand: install --registry https://blabla.pkgs.visualstudio.com/_packaging/BlaBla/npm/registry/
现在我也得到了同样的结果npm WARN
,但这次我得到的不是无效的 URL 错误
npm ERR! code E401
npm ERR! Unable to authenticate, your authentication token seems to be invalid.
这个问题困扰了我好几个小时。所以任何帮助或指导都非常感谢。提前谢谢!
你的猜测是正确的。当你在 bash 中使用 export 命令设置环境变量时,它只能在当前会话中工作。而 NPM 任务正在不同的会话中工作。因此它无法读取正确的环境。
为了满足您的要求,您可以直接使用 feed url 定义管道变量并设置格式:
${REGISTRY}
在 npmrc 文件中使用环境变量。以下是一个例子:
.npmrc 文件:
管道示例:
结果: 我们可以在 NPM 任务中看到有效的 NPM 注册 URL。
另一方面,我想分享另一种更简单的使用私有 feed 的方法。如果你的管道和 feed 在同一个组织中,你可以直接在 NPM 任务中设置
customRegistry
andcustomFeed
。例如:
在这种情况下,您不需要在项目.npmrc 文件中设置任何其他配置。
更新:
当我们在 NPM 任务中使用管道环境变量来替换 .npmrc 文件中的注册表值时,它可能不会自动设置注册表的凭据并导致 401 错误。
如果遇到此问题,您可以考虑在 npm 任务之前使用sed 命令替换注册表 url。
以下是一个例子:
.npmrc 文件:
管道示例: