私有仓库必须在使用项目的根composer.json中声明repositories,否则require失败;常见错误是仅修改了私有包自身的composer.json、auth.json权限非600或位置错误、git tag格式不合规。

私有仓库必须在项目 composer.json 的 repositories 字段显式声明,否则 composer require 一定失败。
为什么加了 repositories 还是找不到包?
最常见原因是:你只改了私有包自己的 composer.json,却没在使用它的那个项目的根 composer.json 里加 repositories。Composer 不会自动扫描内网 Git 或本地路径,它只认这个字段里写的地址。
-
type推荐用vcs(直连 Git)或composer(对接 Satis 等服务),别用package——手动写每个版本太容易漏、难同步 - 如果
url是 HTTPS Git 地址,认证凭据不能写进composer.json,得走auth.json;如果是 SSH 地址,确保系统ssh-agent已加载对应 key - 拼写错误高频点:
https://git.internal/project-a写成https://git.internal/project_a(下划线)、少一个/、协议写成http却没配 Nginx 重定向
require-all: true 和 require { "vendor/name": "*" } 有什么区别?
前者让 Satis 把所有分支和 tag 都收录进 packages.json,后者只拉指定包的匹配版本。区别直接影响客户端能 require 什么。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
require-all: true简单粗暴,但会把dev-main、feature/login全塞进去,项目里若没设"minimum-stability": "dev",这些开发版根本装不上 -
"require": { "myorg/logger": "*" }更干净,但要求目标 Git 仓库的composer.json里name字段严格匹配(比如不能是MyOrg/logger或myorg-logger),且该仓库必须打了合规 tag(v1.2.0或1.2.0) - 如果你删掉了私有包
composer.json中的version字段,那是对的——Satis 和 Composer 都忽略它,只看 Git tag
auth.json 权限不对或放错位置,就会 Authentication failed
Composer 只读取两个地方的 auth.json:用户家目录(~/.composer/auth.json)或项目根目录。放错位置、权限不是 600,它直接无视。
- Linux/macOS 下必须运行
chmod 600 auth.json,否则报错但不提示原因 - CI 环境别用
composer config --global写凭据——不同项目可能要用不同 token,应改用COMPOSER_AUTH环境变量传入 JSON 字符串 - HTTP Basic Auth 场景下,
auth.json里http-basic的 key 必须和仓库域名完全一致,比如"repo.internal.com"不能写成"https://repo.internal.com"
Satis 构建后 packages.json 为空或报 Git 克隆失败
构建失败基本卡在 Git 层,不是 PHP 或 JSON 配置问题。
-
Failed to clone https://git.internal/project-x:运行php bin/satis build的用户没有 Git 权限,或没配好 credential helper(HTTPS)/ ssh-agent(SSH) -
Could not parse version constraint dev-main:目标仓库composer.json里写了"version": "dev-main",删掉这行,让 Satis 从 tag 推断 - 生成的
packages.json里packages数组为空:检查satis.json中repositories.url是否可访问,且对应 Git 仓库根目录下存在合法的composer.json(含name和autoload)
真正麻烦的从来不是配置几行 JSON,而是 Git tag 格式、auth.json 权限、以及“到底该改哪个 composer.json”这三个点——它们不出错时一切顺利,一出错就全链路中断,还很难定位。










