nexus默认不支持composer仓库,因composer类型自3.45.0版起才作为实验性功能加入,旧版本(如3.42.0)无该选项;正确配置需用3.68.0+版本,按序创建proxy、hosted、group三类composer仓库,并显式启用http端口与禁用packagist.org。

Composer私有镜像库不能直接用Nexus的Docker仓库功能——Nexus本身不原生支持Composer(PHP)的packagist.org协议,必须通过proxy + hosted + group三层组合,并启用composer格式仓库类型才能落地。强行套用Docker配置会失败,且无法触发自动包发现和依赖解析。
为什么Nexus默认不支持Composer仓库?
Nexus OSS 3.x虽支持20+种制品格式,但composer类型是**从3.45.0版本起才正式加入**的实验性功能,且需手动启用;早于该版本的镜像(如sonatype/nexus3:3.42.0)压根没有composer仓库选项。控制台里找不到composer (proxy)或composer (hosted)模板,就是版本太老了。
常见错误现象:
- 在
Repository → Create repository下拉菜单中无composer选项 - 创建完
maven2或raw仓库后,composer require报Could not parse version constraint -
composer config -g repos.xxx composer http://nexus:8081/repository/composer-proxy/后执行install返回404 Not Found(实际是Nexus未识别composer请求路径)
正确配置Composer仓库的三步关键操作
必须使用sonatype/nexus3:3.68.0或更高版本(2026年主流生产推荐),并按顺序完成:
- 登录
http://nexus-host:8081→Settings → Repositories → Create repository,选择composer (proxy),Remote storage URL填https://packagist.org(注意必须是HTTPS,HTTP会拒绝连接) - 再新建一个
composer (hosted)仓库,Deployment policy选Allow redeploy,这是上传私有包(如myorg/my-package)的唯一入口 - 最后建一个
composer (group)仓库,把上面两个仓库拖进去聚合;对外只暴露这个group的URL,例如http://nexus:8081/repository/composer-group/
特别注意:composer (proxy)仓库的HTTP port必须显式开启(默认不勾选),否则代理请求根本进不来;而hosted仓库无需开HTTP端口,它只响应composer install时的元数据查询和composer push时的上传请求。
客户端composer.json与全局配置要点
PHP项目要走私有源,不能只改repositories,还必须禁用Packagist默认源,否则会并行请求公有源导致超时或冲突:
{
"repositories": [
{
"type": "composer",
"url": "http://nexus:8081/repository/composer-group/"
}
],
"minimum-stability": "stable",
"prefer-stable": true,
"packagist.org": false
}
全局配置(一次设置,全项目生效):
composer config -g repos.packagist composer http://nexus:8081/repository/composer-group/-
composer config -g packagist false(这步漏掉,require仍会 fallback 到 packagist.org)
验证是否生效:composer show -p应只列出你私有仓库里的包;composer diagnose会提示Repo packagist is disabled才算成功。
权限、缓存与CI/CD集成避坑点
Composer仓库的权限模型和Maven不同:它不校验composer.json里的name字段前缀,而是靠Nexus的content selector + repository view权限控制访问范围。这意味着:
- 想限制开发组只能读
myorg/*包,得先在Security → Content selectors里建规则:name == "myorg/*" - 再创建角色,绑定
nx-repository-view-composer-*-read+ 该selector,而非简单给read整个仓库 - CI/CD中上传私有包时,
composer publish命令不存在,必须用curl -X PUT或composer artifact插件,且Token需用Nexus生成的API key(不是UI密码)
缓存行为也容易误判:Nexus对Composer的packages.json缓存默认是24小时,修改了私有包的composer.json后,新版本不会立刻可见,需手动在UI里点击Invalidate cache或调用POST /service/rest/v1/repositories/{repoName}/invalidate-cache API。











