Composer 承认私有 Packagist 需三步:配置合法 repositories(URL 以 / 结尾)、禁用 packagist.org(设 "packagist.org": false)、正确设置 auth.json 或 COMPOSER_AUTH;Satis 要求 Git 仓库有语义化 tag 且支持 HTTPS 访问。

怎么让 Composer 承认你的私有 Packagist?
Composer 不会自动信任任意 URL,它只按规则加载 repositories 配置的源,并严格校验响应格式和路径。核心不是“加一个地址”,而是让那个地址返回合法的 packages.json —— 且必须是 200 OK、JSON 格式、字段完整。
-
url 必须以 / 结尾,否则 Composer 会拼成 <a href="https://www.php.cn/link/380cbada0c579524d75d048afda52b77">https://www.php.cn/link/380cbada0c579524d75d048afda52b77</a>(正确) vs <a href="https://www.php.cn/link/91da4e7241d7ad467cb4127f4374a3c4">https://www.php.cn/link/91da4e7241d7ad467cb4127f4374a3c4</a>(404)
- 先手动
curl -v <a href="https://www.php.cn/link/380cbada0c579524d75d048afda52b77">https://www.php.cn/link/380cbada0c579524d75d048afda52b77</a> 验证:状态码 200、Content-Type 是 application/json、内容可被 json_decode() 解析
- 若用 Satis 搭建,
satis.json 中必须声明 name 和 homepage,否则 Composer 直接跳过该源
为什么装不了同名包?顺序和开关没关对
Packagist.org 是 Composer 的隐式默认源;你加的私有源默认不覆盖它。哪怕你在 repositories 里写了私有地址,只要没关掉官方源,Composer 就可能从 packagist.org 拉下同名但版本不同的包 —— 导致冲突或误装。
- 把私有源放在
repositories 数组第一位
- 显式禁用官方源:
"packagist.org": false(写在 composer.json 顶层,和 repositories 同级)
- 示例片段:
{
"repositories": [
{ "type": "composer", "url": "https://packagist.myorg.com/" }
],
"packagist.org": false
}
- 改完立刻执行
composer clear-cache,否则旧缓存可能继续生效
认证失败总提示 “Authentication required” 怎么办?
Composer 查找凭据有固定路径优先级:当前目录/auth.json → $COMPOSER_HOME/auth.json → $HOME/.composer/auth.json(旧版)。放错位置就白配。
- 别把 token 写进
composer.json —— 这是严重安全风险,且会被提交到 Git
- 正确做法:在项目根目录放
auth.json,内容为:
{ "http-basic": { "packagist.myorg.com": { "username": "", "password": "your_api_token_here" } } }
- CI 环境中
$COMPOSER_HOME 常为空,导致它去读空的全局 auth.json;应显式用 COMPOSER_AUTH 环境变量传入 JSON 字符串
Satis 构建失败:“Skipping package, no suitable releases found”
Satis 不克隆仓库、不解析分支、不处理 SSH 权限 —— 它只看 Git tag。常见失败根本不在 JSON 生成环节,而在源头没准备好。
- 私有 Git 仓库必须支持 HTTPS + token 访问(或配置好 SSH agent),Satis 不会弹窗输密码
- 包仓库必须打过语义化 tag(如
v1.0.0),不能只有 main 分支提交
- 若依赖了其他私有包,需在
satis.json 中开启 "require-dependencies": true,否则依赖树不全,Satis 会跳过整个包
url 必须以 / 结尾,否则 Composer 会拼成 <a href="https://www.php.cn/link/380cbada0c579524d75d048afda52b77">https://www.php.cn/link/380cbada0c579524d75d048afda52b77</a>(正确) vs <a href="https://www.php.cn/link/91da4e7241d7ad467cb4127f4374a3c4">https://www.php.cn/link/91da4e7241d7ad467cb4127f4374a3c4</a>(404)curl -v <a href="https://www.php.cn/link/380cbada0c579524d75d048afda52b77">https://www.php.cn/link/380cbada0c579524d75d048afda52b77</a> 验证:状态码 200、Content-Type 是 application/json、内容可被 json_decode() 解析satis.json 中必须声明 name 和 homepage,否则 Composer 直接跳过该源repositories 里写了私有地址,只要没关掉官方源,Composer 就可能从 packagist.org 拉下同名但版本不同的包 —— 导致冲突或误装。
- 把私有源放在
repositories数组第一位 - 显式禁用官方源:
"packagist.org": false(写在composer.json顶层,和repositories同级) - 示例片段:
{ "repositories": [ { "type": "composer", "url": "https://packagist.myorg.com/" } ], "packagist.org": false } - 改完立刻执行
composer clear-cache,否则旧缓存可能继续生效
认证失败总提示 “Authentication required” 怎么办?
Composer 查找凭据有固定路径优先级:当前目录/auth.json → $COMPOSER_HOME/auth.json → $HOME/.composer/auth.json(旧版)。放错位置就白配。
- 别把 token 写进
composer.json —— 这是严重安全风险,且会被提交到 Git
- 正确做法:在项目根目录放
auth.json,内容为:
{ "http-basic": { "packagist.myorg.com": { "username": "", "password": "your_api_token_here" } } }
- CI 环境中
$COMPOSER_HOME 常为空,导致它去读空的全局 auth.json;应显式用 COMPOSER_AUTH 环境变量传入 JSON 字符串
Satis 构建失败:“Skipping package, no suitable releases found”
Satis 不克隆仓库、不解析分支、不处理 SSH 权限 —— 它只看 Git tag。常见失败根本不在 JSON 生成环节,而在源头没准备好。
- 私有 Git 仓库必须支持 HTTPS + token 访问(或配置好 SSH agent),Satis 不会弹窗输密码
- 包仓库必须打过语义化 tag(如
v1.0.0),不能只有 main 分支提交
- 若依赖了其他私有包,需在
satis.json 中开启 "require-dependencies": true,否则依赖树不全,Satis 会跳过整个包
composer.json —— 这是严重安全风险,且会被提交到 Gitauth.json,内容为:
{ "http-basic": { "packagist.myorg.com": { "username": "", "password": "your_api_token_here" } } }
$COMPOSER_HOME 常为空,导致它去读空的全局 auth.json;应显式用 COMPOSER_AUTH 环境变量传入 JSON 字符串- 私有 Git 仓库必须支持 HTTPS + token 访问(或配置好 SSH agent),Satis 不会弹窗输密码
- 包仓库必须打过语义化 tag(如
v1.0.0),不能只有main分支提交 - 若依赖了其他私有包,需在
satis.json中开启"require-dependencies": true,否则依赖树不全,Satis 会跳过整个包
真正卡住的地方,往往不是配置写错了,而是 Git 权限没通、tag 没推、或者 packages.json 被 Nginx 缓存了旧版本 —— 先 curl,再清缓存,最后看日志。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。

















