私有仓库必须在项目根目录composer.json中显式声明repositories数组,否则composer require一定失败;它必须是JSON数组,每项含合法type(vcs/composer/path)和对应url,认证凭据仅能通过权限600的auth.json配置。

私有仓库不是“搭好就能用”,必须在项目级 composer.json 中显式声明 repositories,否则 composer require 一定失败——Composer 不会探测、不会提示、只会安静报 Could not find package。
repositories 字段必须写在项目根目录的 composer.json 里
很多人误以为改私有包自己的 composer.json 就够了,其实完全无效。Composer 只读取你当前要安装依赖的那个项目的顶层 composer.json 中的 repositories 数组。
-
repositories必须是 JSON 数组,不能是对象(比如{"my-repo": {}}是错的) - 每项必须含
"type"和"url";type只能是"vcs"、"composer"或"path",不能写成"git"或"github" - URL 指向 Git 仓库根目录(即包含
composer.json的那个地址),不能是网页链接(如 GitHub 的 tag 页面)、不能带.git后缀(vcs类型下可加,但非必须;composer类型下绝对不能加) - 多个源时顺序决定优先级:Composer 从上到下匹配,第一个命中就停,同名包后面的会被忽略
auth.json 是唯一合法的凭据载体,且权限必须为 600
HTTPS 私有 Git(GitLab/GitHub/Bitbucket)或 Satis 源需要认证,但凭据绝不能硬编码进 composer.json 或 URL 里,否则泄露风险极高。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
auth.json必须放在项目根目录(与composer.json同级)或全局COMPOSER_HOME目录下 - Linux/macOS 下必须运行
chmod 600 auth.json;权限不对,Composer 会静默忽略,不报错也不提示 - 内容格式严格:HTTP Basic 认证走
http-basic字段,key 是域名(如"gitlab.example.com"),不是完整 URL;GitHub 走github-oauth;Bitbucket Cloud(Composer 2+)只认bitbucket-oauth.bitbucket.org - CI 环境推荐用
COMPOSER_AUTH环境变量注入 JSON 字符串,避免挂载文件失败
vcs 类型下版本号完全依赖 Git tag,不是 composer.json 的 version 字段
当你写 "require": {"myorg/pkg": "^1.0"},Composer 实际查的是 Git 仓库里的 tag,而不是私有包自己 composer.json 里的 version 值——这个字段在 vcs 模式下被彻底忽略。
- 语义化 tag 必须合规:
v1.0.0或1.0.0可被识别;v1.0、1.0、feature/login都不行 - 没打任何 tag 时,唯一可用选项是
dev-main(或dev-master),且需在composer.json顶层设"minimum-stability": "dev" - 分支名如
release/2.1对应虚拟版本dev-release/2.1,require 时必须写全,且同样依赖minimum-stability - 修改 tag 对应的 commit 后强制推送,Git 服务器缓存可能未刷新,Composer 仍拉旧版——此时需清缓存:
composer clear-cache
Satis 类型必须由 Web 服务器托管 packages.json,且 URL 末尾要带 /
Satis 不是服务,只是静态文件生成器。你跑完 php bin/satis build,它只产出 packages.json 和 ZIP 包,后续全靠 Nginx/Apache 托管并响应请求。
-
repositories中url必须以/结尾(如"https://satis.internal/"),否则 Composer 会拼出https://satis.internal/packages.json(404) - Nginx 必须显式支持
.jsonMIME 类型:add_header Content-Type application/json;放在location ~ \.json$块内 -
satis.json中的homepage必须和客户端repositories.url完全一致(包括协议、域名、端口、路径、末尾斜杠) - 务必在
repositories数组最前面加{"packagist.org": false},否则同名包可能从官方源拉取,覆盖你的私有版本
最容易被忽略的是三处对齐:Satis 输出路径与 Web 服务器 root 的路径对齐、auth.json 域名与实际访问域名的大小写对齐、Git tag 格式与 Composer 版本解析规则的语义对齐——任一环节错位,错误都静默发生,没有明确报错指向根源。

















