根本原因是Satis仅识别satis.json明确定义的包源与版本,不自动解析项目依赖树;需确保repositories类型为"vcs"、name严格匹配、archive配置启用、dist路径可访问、Git标签合规,并全局替换Packagist源。

为什么 satis build 之后 composer install 还报 “could not find package”
根本原因不是网络不通,而是 Satis 没真正“看见”你要的包——它只认 satis.json 里明确列出的源和版本,不自动分析你项目依赖树。
-
repositories必须是"type": "vcs",不能写成"type": "git"(后者无法解析分支别名,dev-main会直接被忽略) - 私有 Git 仓库若用 SSH,得提前在构建机配好
~/.ssh/id_rsa和 known_hosts;用 HTTPS 则必须在 URL 中带 token:https://token:x-oauth-basic@gitlab.internal/lib-a.git -
require和require-all不能共存,混用会导致静默跳过部分包;想全量镜像就只留"require-all": true,想精准控制就删掉这行,改用"require": {"vendor/package": "dev-main"} - 包的
composer.json里name字段必须严格匹配,比如写成"acme/utils",就不能在satis.json里写成"ACME/utils"或"acme-utils"
dist 包下载失败:curl 能通但 composer install 报 “file could not be downloaded”
这不是权限或网络问题,是 Web 服务器没正确暴露 dist 文件路径,或者 MIME 类型没配对。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Satis 默认把 ZIP 放在
dist/vendor-package/version-hash.zip,Nginx/Apache 必须能让这个路径被直接 GET 到,比如访问https://pkgs.your.org/dist/acme-utils/1.0.0.0-abc123.zip返回 200 - Nginx 需加
types { application/json json; },否则packages.json响应头是text/plain,Composer 拒绝解析 - Apache 要启用
mod_mime并确保.json关联application/json - 检查
satis.json是否启用了 archive:没配"archive": {"format": "zip", "skip-dev": false},Satis 就不会生成 ZIP,composer install --prefer-dist只能退回到 clone,而内网往往禁了 Git 端口
离线环境部署前最该做的三件事
离线不是“断网后还能用”,而是“断网前必须把所有依赖链上的每个字节都拉下来”。漏一个,整条链就断。
- 在联网机器上跑
composer show --tree,把输出里所有包名(包括psr/log这类间接依赖)逐个抄进satis.json的require字段——Satis 不递归分析,只照单抓取 - 执行
composer config --global repo.packagist false彻底关掉默认源,否则哪怕配了私有仓库,Composer 仍会先去连repo.packagist.org,然后超时失败 - 构建时显式加
--skip-errors很危险:它会让失败包静默消失,建议首次构建不加,等所有Could not clone或no matching tag错误都修完再批量跑
怎么让团队不用改每个项目的 composer.json
靠全局配置锁定私有源,不是“加一个”,而是“换一个”——让 Composer 根本不知道 packagist.org 的存在。
- 运行
composer config -g repositories.my-satis '{"type": "composer", "url": "https://pkgs.your.org/"}',注意 URL 末尾必须有/ - 这条命令会写入
~/.composer/config.json,同时自动把packagist.org设为 disabled - 验证是否生效:
composer config -l | grep repo,输出里应该只有你的私有源,没有packagist.org相关字段 - 如果用了 HTTP Basic Auth,得补上
"options": {"http": {"header": ["Authorization: Basic base64string"]}},否则请求会被 401 拦住,且不报错
v1.0.0),哪怕分支上有 composer.json,Satis 默认也当它不存在。开发分支要用,就得配 "minimum-stability": "dev" 和 "prefer-stable": false,而且得确保那个 dev 分支在 repositories 列表里真实可访问。

















