如何配置Yarn通过GitLab实例级注册表安装私有npm包
Yarn 1.22.x(Classic版本)存在实例级npm注册表的路径解析兼容问题:查询包元数据时会正常走配置的实例级注册表地址,拉取包tar压缩包时会直接请求GitLab返回的项目级绝对路径,不会自动复用实例级路径下配置的鉴权token。而GitLab 14.x版本对未携带有效鉴权的包下载请求,统一返回404 Not Found而非403 Unauthorized,就会出现元数据查询返回200、拉包时报404的现象。
之前单独添加项目ID为27的路径鉴权仍然失败,是因为手动写死单个项目ID的鉴权规则无法覆盖@myorg作用域下其他项目的包路径,且部分场景下Yarn不会正确匹配层级过深的路径鉴权配置。
方法1:补全通配路径鉴权(无需调整注册表地址,适配多项目包场景)
修改.npmrc配置,为GitLab实例下所有项目级包路径统一配置鉴权,不需要单独给每个项目ID写配置:
@myorg:registry=https://myorgsgitlab:port/api/v4/packages/npm/ //myorgsgitlab:port/api/v4/packages/npm/:_authToken=asdf //myorgsgitlab:port/api/v4/projects/:_authToken=asdf always-auth=true
配置生效后,无论Yarn跳转到哪个项目ID下的包下载路径,都会自动携带鉴权token,即可正常拉取跨项目的同作用域包。使用的个人访问令牌需要开通实例范围的read_package权限,确保能访问所有对应项目的包资源。
方法2:替换包管理工具
Yarn Classic已停止功能迭代,该路径解析bug不会被官方修复。直接换用npm、pnpm或Yarn 2.x+(Berry)版本,不需要额外配置路径鉴权,即可正常使用实例级注册表拉取跨项目的私有包。
方法3:改用组级注册表
如果必须留存Yarn 1.x环境,可将@myorg作用域下的所有包发布到对应GitLab组的组级注册表,注册表地址格式为https://myorgsgitlab:port/api/v4/groups/<你的组ID>/-/packages/npm/。该路径下Yarn 1.x可正确解析tarball地址,无需处理多项目ID的路径跳转问题。
内容的提问来源于stack exchange,提问作者vivid_voidgroup

