项目级配置是唯一可靠方案,因全局配置不进git、ci环境缺失、多项目认证无法隔离,且repositories必须为顶层数组、顺序决定匹配逻辑,私有源需放前并显式添加packagist.org。

直接在项目级 composer.json 里写死 repositories 并设 "packagist.org": false,是唯一可靠、可版本控制、CI 友好的做法。全局配置或手动改 ~/.composer/config.json 在团队协作中必然失效。
为什么不能用 composer config --global 配私有源
全局配置写入 ~/.composer/config.json,它不进 Git,不同成员机器上内容不一致;CI 环境(如 GitHub Actions)默认没这个文件,composer install 会直接报 Could not find package;更隐蔽的是:一旦某人执行 composer config --global --unset repositories.xxx,整个本地环境就断连,且无日志提示哪一行配错了。
- CI 脚本若依赖全局源,必须额外加
composer config --global步骤,增加失败点 - 多个项目共用同一私有源,但各自需要不同认证域(比如 A 项目连 Artifactory,B 项目连 GitLab),全局
auth.json无法按项目隔离 -
composer config --global设置的仓库,在composer show -p中可见,但composer update -v日志里不会显示实际请求了哪个源——排查 401/404 时毫无头绪
repositories 必须是顶层数组,且顺序决定匹配逻辑
Composer 不会递归扫描字段,repositories 必须出现在 composer.json 最外层,嵌套在 config 或 extra 里等于没写。它按数组顺序逐个检查,命中即停,不回退。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 私有源要放前面,否则
your-company/utils可能被误路由到packagist.org找不到而报错 - 如果同时用 Artifactory 虚拟源和 Satis 静态源,两者都设
"type": "composer",但 URL 格式不同:https://artifactory.example.com/artifactory/api/composer/my-virtual/(末尾斜杠必有),而 Satis 是https://packages.example.com/(通常无/api/composer/) - 必须显式把
packagist.org加回来,除非你确认所有依赖都在私有源里:{ "repositories": [ { "type": "composer", "url": "https://artifactory.example.com/artifactory/api/composer/internal-virtual/" }, { "type": "composer", "url": "https://packagist.org" } ], "packagist.org": false }注意:"packagist.org": false关闭的是隐式源,不是数组里的那个显式项
私有包能被 require 到的关键条件
光把仓库 URL 写对还不够。Artifactory 和 Satis 对“包可见性”的要求完全不同,但都卡在三个硬性点上。
- 包的
composer.json中name字段必须是vendor/name格式,且与composer require vendor/name完全一致——大小写、中划线、下划线都不能差一个字符 - Artifactory 要求上传必须走其 Composer API 或
composer publish,Web UI 上传 ZIP 文件无效;Satis 则必须靠php bin/satis build扫描 VCS 仓库生成packages.json,且satis.json中repositories的 URL 必须带.git后缀(如https://gitlab.example.com/team/pkg.git) - 认证必须透传:Artifactory 用
~/.composer/auth.json里的http-basic域名键精确匹配(如 URL 是https://artifactory.example.com:8443/...,key 就得是"artifactory.example.com:8443");GitLab 则必须用oauth2用户名 +glpat-开头的 Token
CI/CD 中 auth.json 的路径和权限容易被忽略
CI 环境里 ~/.composer/auth.json 不是自动存在的,且权限错误会导致认证静默失败——composer install 不报错,但所有私有源请求都返回 401,日志里也看不到 Authorization 头。
- Linux/macOS 下必须
chmod 600 ~/.composer/auth.json,否则 Composer 直接跳过读取 - GitHub Actions 示例:
- name: Setup auth.json run: | mkdir -p ~/.composer echo '${{ secrets.COMPOSER_AUTH }}' > ~/.composer/auth.json chmod 600 ~/.composer/auth.json其中COMPOSER_AUTH是预存的 JSON 字符串,不是文件路径 - GitLab CI 要注意 runner 用户是否为
root,~可能指向/root而非服务账户家目录,建议用绝对路径/home/gitlab-runner/.composer/auth.json










