private packagist 需在项目根目录配 auth.json,用户名填带 read 权限的 api token、密码留空字符串;composer.json 中通过 repositories 显式添加私有源,type 为 composer,且私有源需置于数组首位以避免包名冲突;dev 分支需后台开启“enable development version support”并手动 resync。

Private Packagist 的认证方式怎么配才不报 401?
Private Packagist 不是开箱即用的镜像,必须显式配置凭证,否则 composer install 或 composer update 会卡在 401 Unauthorized,尤其在 CI 环境里容易误以为是网络或缓存问题。
- 凭证必须通过
auth.json提供,不能只靠composer config命令写入(它默认写进用户级配置,CI 容器里往往不生效) -
auth.json要放在项目根目录(和composer.json同级),内容格式严格:{ "http-basic": { "repo.packagist.com": { "username": "your-api-token", "password": "" } } }注意:用户名填 API token,密码字段留空字符串(不是null或删掉该键) - Token 必须有
read权限,且绑定到对应组织/仓库;在 Private Packagist 后台生成时别选错 scope
composer.json 里怎么写 private repo 才不和 packagist.org 冲突?
Private Packagist 是私有包托管服务,不是镜像代理,所以不能简单把 packagist.org 换成你的域名——那样会导致所有公共包也走私有源,结果找不到 laravel/framework 这类包。
- 必须用
repositories显式声明私有源,并设"type": "composer":"repositories": [ { "type": "composer", "url": "https://repo.packagist.com/your-org/" } ] - 不要加
"packagist.org": false,除非你真想完全禁用公共源;多数场景下保留默认源 + 单独加私有源更安全 - 如果私有包名用了和公共包一样的 vendor/name(比如
acme/utils),Composer 会优先从第一个匹配的源拉取——顺序很重要,私有源要放在repositories数组前面
为什么 composer update 拉不到私有包的 dev 分支?
Private Packagist 默认只同步 tagged releases(v1.0.0、v2.1.0 等),dev-main 或 dev-feature/x 这类开发分支不会自动出现,composer require acme/package:dev-main 会提示 Could not find package。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 进 Private Packagist 后台,在对应包的 Settings → “Enable development version support” 打钩(需管理员权限)
- 勾选后还要点 “Resync” 手动触发一次同步,否则分支信息不会立刻更新
- 本地执行
composer clear-cache,再composer update --with-all-dependencies,否则 Composer 可能还拿着旧的包元数据
CI 构建里如何安全传入 auth.json?
直接把 auth.json 提交到 Git 是高危操作,但硬编码 Token 到 CI 脚本又容易泄露。最简可控的做法是运行时注入文件内容。
- GitHub Actions:用
echo "${{ secrets.PRIVATE_PACKAGIST_TOKEN }}" > auth.json配合上面的 JSON 结构生成临时文件 - GitLab CI:用
before_script把变量写成文件,注意 JSON 转义:echo '{ "http-basic": { "repo.packagist.com": { "username": "'"$PRIVATE_PACKAGIST_TOKEN"'", "password": "" } } }' > auth.json - Docker 构建中避免用
COPY auth.json,改用--secret挂载,或在 entrypoint 脚本里动态生成
Token 泄露后无法撤销单个 token,只能重置整个组织的 API 密钥——这意味着所有 CI 和本地配置都要同步更新。每次换 token 前,先确认哪些地方写了死值,这点比功能配置更值得花时间核对。










