必须在项目composer.json的repositories中声明私有源、配置600权限的项目级auth.json、确保包名与require完全一致、打合规git tag或用dev-main分支别名,否则composer install会失败。

Composer私有仓库不是配个satis.json就能跑通,必须同时解决认证、包发现、版本同步和依赖隔离四件事,否则composer install会静默失败、CI报Could not find package、或开发环境拉不到dev-main分支。
为什么auth.json放错位置就401?
Nginx Basic Auth只拦住HTTP请求,但Composer在解析packages.json前,会先向Git仓库发起HEAD请求校验存在性——这个请求不带Authorization头,所以Git服务器(如GitLab)直接返回401。常见错误现象:本地composer require成功,CI里失败;或者packages.json能加载,但dist ZIP下载卡住。
-
auth.json必须放在项目根目录,不能只放~/.composer/auth.json——CI环境没用户家目录 - Git URL必须用HTTPS格式,禁用
git@开头的SSH地址(CI通常没SSH密钥) - 用户名填个人访问令牌(PAT),密码字段填
token或空字符串(GitLab要求填x-oauth-basic,GitHub要求留空) - 如果用Satis,Nginx配置里
auth_basic要覆盖/packages.json和/dist/路径,但/根路径必须deny all
repositories写在composer.json还是全局?
项目级配置是唯一安全选择。全局配置(composer config)会污染所有项目,导致不同团队的私有包互相干扰,尤其当A部门用acme/utils、B部门也用同名包但不同Git源时,Composer会随机选一个。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在项目
composer.json中写:"repositories": [{"type": "composer", "url": "https://pkgs.internal.acme.com"}] - 不要用
"type": "vcs"直连Git——它绕过私有仓库的权限控制和审计日志 - 若用Satis,URL必须以
/packages.json结尾(如https://pkgs.internal.acme.com/packages.json),否则Composer无法识别 - 多个私有源按顺序排列,Composer从左到右匹配,同名包取第一个
require里写dev-main还是^2.0?
写^2.0会导致Composer去Packagist查版本,而你的私有包根本不在那里;写dev-main才能强制走VCS或私有仓库的最新提交,但前提是Git仓库有main分支且已推送。
- 私有包未打Tag时,必须用
dev-xxx(如dev-main、dev-develop),不能省略dev-前缀 - 打了Tag后,优先用语义化版本(如
"acme/utils": "^1.3"),避免dev-别名在生产环境被意外更新 - CI流程中加
--no-dev参数,否则dev-包可能被跳过或报错 - 执行
composer update acme/utils而非install——install只读composer.lock,不会触发新分支拉取
autoload映射错一个字符,运行时才崩
Composer不验证autoload路径是否存在,也不检查命名空间是否拼错。错误只有在PHP首次尝试加载类时抛Class not found,且堆栈里找不到源头是哪个包。
-
"App\": "src/"里的双反斜杠\是JSON转义必需,写成"App": "src/"整段配置会被忽略 - 路径必须相对于包根目录,
"src/"不能写成"./src/"(点斜杠被忽略)或"src"(少末尾斜杠,PSR-4规范不认) - 如果包结构是
lib/Domain/,autoload就得写"Acme\Domain\": "lib/Domain/",不能写"Acme\Domain\": "src/Domain/" - 调试时先跑
composer dump-autoload(不加-o),优化版缓存会掩盖路径错误
最常被忽略的是Git分支与Composer版本别名的映射关系:Satis默认只导出带Tag的版本,dev-main要靠"archive": {"skip-dev": false}显式开启,否则composer install --prefer-dist会失败——ZIP包根本不存在。










