执行AWS CodeArtifact npm登录命令时如何保留npm官方默认注册表
CodeArtifact登录不修改全局npm源的实现方案
问题根因
直接执行aws codeartifact login --tool npm时,CLI默认会自动覆写项目.npmrc文件中的全局registry配置,将所有包的默认下载源切换为指定的CodeArtifact仓库地址,和「仅对@my-npm私有作用域配置CodeArtifact源、全局始终保留npm公共源」的需求不匹配。
改造步骤
- 替换原有依赖CodeArtifact CLI自动写入全量.npmrc的登录逻辑,改为单独拉取鉴权token,手动写入必要的鉴权配置项,全程不触碰全局
registry字段 - 在项目根目录预先固定.npmrc的基础配置,不依赖脚本动态生成公共源、作用域源的基础地址
1. 调整package.json中的脚本配置
把原有co:login脚本从直接调用login命令,改为「拉取临时token + 追加鉴权配置到.npmrc」的两步逻辑,完整配置参考:
{ "name": "my-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "preinstall": "npm run co:login", "co:login": "TOKEN=$(aws codeartifact get-authorization-token --domain my-domain --domain-owner <123456789> --profile <me> --query authorizationToken --output text) && printf '\n//my-domain-<123456789>.d.codeartifact.eu-west-1.amazonaws.com/npm/my-repo/:always-auth=true\n//my-domain-<123456789>.d.codeartifact.eu-west-1.amazonaws.com/npm/my-repo/:_authToken=%s\n' \"$TOKEN\" >> .npmrc", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { "uuid": "^3.3.2", "@my-npm/my-common": "1.0.0" } }
2. 固定项目.npmrc基础配置
在项目根目录的.npmrc文件中预先写入全局公共源、作用域源的基础规则,这部分内容不会被登录脚本修改:
registry=https://registry.npmjs.org @my-npm:registry=https://my-domain-<123456789>.d.codeartifact.eu-west-1.amazonaws.com/npm/-repo/
注意:如果需要兼容Windows多环境执行,核心逻辑保持不变,即不使用
aws codeartifact login的自动覆写.npmrc能力,仅通过get-authorization-token接口获取临时鉴权值,手动追加鉴权配置项即可,全程避免修改全局registry字段。如果担心反复执行脚本导致.npmrc内重复出现鉴权行,可在写入新token前,先过滤删除同仓库地址对应的旧鉴权配置,保证.npmrc结构整洁。
最终效果
执行完npm install触发preinstall脚本后,.npmrc文件会自动追加CodeArtifact对应的鉴权配置,最终结构完全匹配预期:
registry=https://registry.npmjs.org @my-npm:registry=https://my-domain-<123456789>.d.codeartifact.eu-west-1.amazonaws.com/npm/-repo/ //my-domain-<123456789>.d.codeartifact.eu-west-1.amazonaws.com/npm/my-repo/:always-auth=true //my-domain-<123456789>.d.codeartifact.eu-west-1.amazonaws.com/npm/my-repo/:_authToken=<自动拉取的临时鉴权值>
内容的提问来源于stack exchange,提问作者Stéphane GRILLON
相关产品推荐
相关产品推荐

