私有包权限控制必须用auth.json,不能靠.gitignore遮掩;凭证硬编码在composer.json等于泄露密码,正确做法是分场景配置:项目级放根目录并.gitignore、全局用composer config --global、CI用COMPOSER_AUTH环境变量。

私有包权限控制必须用 auth.json,不能靠 .gitignore 遮掩
私有包的访问凭证一旦硬编码在 composer.json 里,就等于把密码写进 Git 历史——哪怕加了 .gitignore,只要有人 commit 过一次,风险就已存在。真正安全的做法是把认证信息抽离到 auth.json,且必须分场景配置:
- 项目级:放在项目根目录,内容只含当前项目所需的仓库凭证,
auth.json必须进.gitignore - 全局级:运行
composer config --global http-basic.repo.example.com username token,凭证落进~/.composer/auth.json,适合 CI 环境统一配置 - CI 场景下建议用环境变量注入:
COMPOSER_AUTH='{"http-basic": {"repo.example.com": {"username": "xxx", "password": "yyy"}}}',避免文件残留
path 仓库不走认证,dev-main 装不上不是权限问题而是元数据没刷新
本地开发用 "type": "path" 时,Composer 完全绕过 HTTP 请求和认证流程,所以 Could not find package 和权限无关。常见误判点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer require myorg/sdk:dev-main失败?先确认myorg/sdk目录下composer.json的name字段是否严格匹配(大小写、斜杠都不能错) - 改过
composer.json后仍不识别?执行composer clear-cache+composer install --no-cache,否则 Composer 会复用旧的元数据缓存 - Windows 下符号链接失败却无报错?显式加
"options": {"symlink": false},否则静默 fallback 到复制模式,改源码不生效
多项目 require 同一私有包不同版本,Composer 不报错但会静默降级
这不是 bug,是依赖求解器的正常行为:它找的是满足所有约束的交集版本。A 项目 require myorg/core:^2.0,B 项目某个依赖锁死 myorg/core:1.9.5,最终装上的就是 1.9.5,且不提示。
- 查谁卡住了升级:
composer prohibits myorg/core:^2.0 - 看依赖树来源:
composer show --tree | grep myorg/core - 别用
conflict段强行排除——它会让安装直接失败,而不是帮你推版本 - 生产环境必须用语义化 tag(如
v2.1.0)替代dev-main,否则分支推送可能意外变更行为
上线前必须删掉 path 配置,否则部署必然失败
"type": "path" 是纯本地开发机制,Docker 构建、K8s Pod、CI 流水线里根本不存在你本机的 ../myorg-sdk 路径。上线前这步漏掉,就会卡在 Could not find package,且错误信息不提示路径问题,只说“找不到包”。
- 正确切换路径:
git checkout -b release-2.1 && git push origin release-2.1→ 在私有 Packagist 上发布 tag → 主项目改repositories为{"type":"vcs","url":"https://git.example.com/myorg/sdk.git"} - 验证是否干净:
composer validate应该不报path类型警告;composer install --no-dev能成功完成 - CI 构建脚本里加检查:
grep -q '"type":"path"' composer.json && exit 1 || echo "path config cleared"
auth.json 的作用域边界和 path 切换时机——前者管“谁能下载”,后者管“从哪下载”,两个环节断一个,整个私有包链就断在 CI 或新成员本地环境里。

















