Private Packagist 必须同时完成全局凭证注册和项目源声明:需用 composer config -g http-basic.repo.packagist.com "" 注册 token,并在 composer.json 中关闭默认源、显式声明私有源;否则必报 401 或 Package not found。
Private Packagist 不是改个
就能用的
它必须同时完成两件事:全局凭证注册 + 项目源声明,缺一不可。只在
里加一条
,一定会报
或
—— 因为 Composer 根本没把 token 发出去。
token 必须通过
注册(注意密码字段留空,Private Packagist 只认用户名位置传 token)
项目
中需显式关闭默认源:
,再声明私有源:
别用
手动写 bearer token —— Private Packagist 不支持
字段,只接受
格式,硬写会静默失效
包装不上?大概率是 Private Packagist 的“可见性”没开
和 packagist.org 不同,Private Packagist 默认不暴露任何包。即使你的 GitHub 私有库已连上、
也写了正确
,只要没手动点进后台「Packages」列表里勾选启用,
或
就永远提示
。
登录
→ 进入组织 → 「Packages」页,搜索你的包名(严格区分大小写),确认状态是
如果是 Git 仓库(如
),必须在后台点击「Sync now」并勾选
运行
再试 —— 缓存可能残留旧的 404 响应,导致重试时直接跳过网络请求
CI 环境里 token 总是认证失败?路径和注入方式搞错了
CI 容器通常没设
,Composer 会去读一个空的全局
,而不是你挂载进去的临时文件。结果就是反复提示
却登不上去。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
别依赖挂载
,改用环境变量
,值为 JSON 字符串:
确保 CI 脚本中
前已正确 export 该变量,且未被后续命令覆盖
本地调试时可用
验证 token 是否真写进了全局配置
为什么不能只靠 Satis 或 GitHub Packages 替代?
Private Packagist 的核心价值不在“能托管”,而在“自动同步 + 权限隔离 + 审计日志”。Satis 是静态快照,GitHub Packages 没包级权限控制 —— 如果你需要让前端组只能拉
,后端组才能装
,或者要查上周谁删了某个版本,这些都绕不开 Private Packagist 的后台管理界面。
它不替代 Git,而是监听 Git 事件:新 tag 推送 → 自动解析
→ 索引入库 → 触发 webhook
所有包访问走统一域名(
),不用每个项目单独配不同源地址
token 权限可细化到 read / read-write / organization admin,且支持轮换审计
真正容易被忽略的是:Private Packagist 的包名必须和 Git 仓库里的
中
字段完全一致,包括 vendor 名大小写;输错一个字母,就等于在另一个宇宙里找包。
repositoriescomposer.json"type": "composer", "url": "https://repo.packagist.com/your-org/"401 UnauthorizedCould not fetchcomposer config -g http-basic.repo.packagist.com "" composer.json"packagist": false"private-packagist": { "type": "composer", "url": "https://repo.packagist.com/your-org/" }auth.jsonbearerhttp-basiccomposer.jsonnamecomposer showinstallPackage not foundpackagist.comEnabledgit@github.com:myorg/utilsInclude in composer repositorycomposer clear-cache$COMPOSER_HOMEauth.jsonAuthentication requiredauth.jsonCOMPOSER_AUTH{"http-basic":{"repo.packagist.com":{"username":"","password":""}}} composer installcomposer config --global --list | grep http-basicui-kitpayment-sdkcomposer.jsonrepo.packagist.comcomposer.jsonname