Verdaccio对代理包的publish处理逻辑及配置方法问询
Verdaccio 配置代理后的发布默认行为及自定义配置方案
Verdaccio 现有文档未明确说明代理场景下的发布逻辑,默认行为如下:
当你给@acme/foo配置了上游代理后,用户发布该包时,Verdaccio 默认会先向上游代理查询是否存在同名同版本的包,如果上游已经存在对应版本,会直接拒绝发布请求,返回EPUBLISHCONFLICT错误,不会把发布请求转发到上游,也不会默认允许你将包存储到本地。
实现本地发布、后续请求优先走本地的配置方法
你需要修改 Verdaccio 的核心配置文件config.yaml,找到packages配置段,新增/修改对应 scope 包的规则:
packages: # 可以单独匹配@acme/foo,也可以用@acme/*匹配整个scope下的所有包 '@acme/foo': # 自定义拉取包的权限,$all代表所有人可拉取,可根据需求调整 access: $all # 自定义发布包的权限,$authenticated代表仅登录用户可发布 publish: $authenticated # *关键配置*:发布时不检查上游是否存在同版本包,避免冲突报错 check_upstream_on_publish: false # 保留你原有的上游代理配置,比如npmjs、公司内部npm源等 proxy: npmjs
修改完成后重启 Verdaccio 服务即可生效。
配置后的效果说明
- 你发布
@acme/foo包时,会直接存储到 Verdaccio 本地存储空间,不会再因为上游存在同版本包触发报错 - 后续用户请求
@acme/foo的任意版本时,Verdaccio 会优先返回本地存储的版本,只有本地不存在的版本才会走代理向上游拉取,完全符合你期望的第三种效果。
原报错原因说明
你之前遇到的EPUBLISHCONFLICT报错,是 Verdaccio 的默认安全机制触发的:默认check_upstream_on_publish配置为开启状态,发布时会先向上游校验版本是否存在,上游已存在同版本时就会拦截发布请求,避免出现本地和上游版本不一致的冲突问题。
内容的提问来源于stack exchange,提问作者Evan Carroll
相关产品推荐
相关产品推荐

