能否在.yarnrc.yml中覆盖同名npmScopes?同Scope跨仓依赖求解
解决Yarn v3下同名Scope跨公私仓库依赖安装问题
问题场景
我们组织拥有两个同名(my-org)的包仓库:一个是托管在NPM的公共仓库,另一个是托管在GitHub的私有仓库,两者无镜像同步。需要npmAuthToken的内部私有包发布到GitHub私有仓库,其余公共包发布到NPM公共仓库。
迁移至Yarn v3后,当前.yarnrc.yml将所有@my-org/*包都指向GitHub私有仓库,导致无法拉取托管在NPM的@my-org/public-pkg。我们期望拉取包时,优先尝试公共仓库,失败后再走私有仓库。
当前.yarnrc.yml配置:
nodeLinker: node-modules npmScopes: "my-org": npmAlwaysAuth: true npmAuthToken: ${MY_NPM_AUTH_TOKEN-fallback} npmRegistryServer: https://npm.pkg.github.com # URL for private registry
依赖说明:
@my-org/public-pkg:托管于NPM公共仓库@my-org/private-pkg:托管于GitHub私有仓库
可行解决方案
方案1:为单个公共包指定注册表
直接在package.json中给目标公共包指定NPM公共仓库地址:
{ "dependencies": { "@my-org/public-pkg": "^1.0.0", "@my-org/private-pkg": "^2.0.0" }, "resolutions": { "@my-org/public-pkg": "npm:@my-org/public-pkg@npm://registry.npmjs.org/" } }
或者在.yarnrc.yml中通过packageExtensions配置:
nodeLinker: node-modules npmScopes: "my-org": npmAlwaysAuth: true npmAuthToken: ${MY_NPM_AUTH_TOKEN-fallback} npmRegistryServer: https://npm.pkg.github.com packageExtensions: "@my-org/public-pkg@*": dependenciesMeta: "@my-org/public-pkg": registry: "https://registry.npmjs.org/"
方案2:配置Scope级注册表Fallback规则
Yarn v3支持为Scope设置注册表 fallback,修改.yarnrc.yml如下:
nodeLinker: node-modules npmRegistries: //registry.npmjs.org/: npmAlwaysAuth: false //npm.pkg.github.com/: npmAlwaysAuth: true npmAuthToken: ${MY_NPM_AUTH_TOKEN-fallback} npmScopes: "my-org": npmRegistryServer: "https://npm.pkg.github.com" npmRegistryFallback: ["https://registry.npmjs.org/"]
此配置下,Yarn拉取@my-org/*包时会先尝试GitHub私有仓库,若找不到对应包,自动 fallback 到NPM公共仓库。
疑问解答
是否可以在
.yarnrc.yml中覆盖同名scope配置?或者有其他可行的解决方案?
无需覆盖整个Scope配置,Yarn v3提供了两种灵活的解决方式:要么为单个公共包单独指定注册表,要么为Scope配置注册表 fallback 规则,都能实现需求。唯一的解决办法是将公共仓库的包镜像到私有仓库吗?
不是。无需镜像公共包到私有仓库,通过上述配置即可实现同一Scope下的包分别从公私仓库拉取,同时满足私有包的权限验证要求。
内容的提问来源于stack exchange,提问作者aayani
相关产品推荐
相关产品推荐

