企业搭建Composer离线源必须用Satis生成含packages.json和所有.zip包的静态仓库,而非仅配镜像地址;国内镜像不托管ZIP,离线时dist.url仍指向GitHub等原始地址导致404;Satis需精确配置require、repositories、archive及Web路径,且客户端须禁用packagist.org并清缓存。

企业搭建 Composer 离线源,不能靠“配个镜像地址”就完事——composer config -g repo.packagist 只改元数据入口,不接管 ZIP 下载;真正离线可用的,必须是 Satis 生成的静态仓库:含 packages.json + 所有包的 .zip 文件 + 正确可访问的 HTTP 路径。
为什么直接配 mirror 域名会失败?
阿里云、USTC 等国内镜像只缓存 packages.json 和 provider-*.json,不托管 ZIP。Composer 安装时仍会从原始 dist.url(比如 GitHub Releases)拉取 ZIP,而这些地址在离线环境必然 404 或超时。
- 验证方式:
composer show vendor/package --verbose,看输出里的dist.url字段 - 真实离线依赖链:项目
composer.lock→ Satis 生成的packages.json→ 同域名下dist/xxx.zip - 任何跳过 ZIP 打包的配置(如没写
archive或skip-dev: false)都会导致composer install --prefer-dist退回到--prefer-source,进而需要 Git 克隆——这在离线环境不可行
satis.json 关键字段怎么写才不漏包?
很多团队构建后发现包“少一半”,问题常出在 require 和 repositories 配置上。Satis 不支持通配符,也不自动递归抓取全部依赖,除非显式启用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
require必须写具体包名+版本约束:"monolog/monolog": "^2.9",不能写"monolog/*": "*" -
repositories列表里每个 VCS 地址必须是完整 HTTPS 或 SSH URL:"https://git.internal/lib-a.git",不支持本地路径或 SVN - 要包含所有依赖(包括 require-dev 的),设
"require-dependencies": true和"require-dev-dependencies": true;但慎用"require-all": true,它会拉下整个 Packagist,动辄几十 GB -
archive是离线核心:"format": "zip"(不是tgz),"skip-dev": true(dev 分支 ZIP 不稳定,且体积大、易构建失败)
构建后其他机器访问 packages.json 404 怎么办?
绝大多数 404 不是网络不通,而是 Web 服务器路径没对齐 Satis 输出结构。Satis 生成的是纯静态文件,无路由逻辑,路径必须严丝合缝。
- Nginx/Apache 的
root必须指向 Satis 构建输出目录(如/var/www/satis),不能多一层或少一层 - 确保
packages.json在根路径可直接访问:curl http://127.0.0.1/packages.json应返回 JSON,且响应头Content-Type: application/json - 客户端
composer.json中"url"必须以/结尾:"url": "http://127.0.0.1/",否则 Composer 会拼成http://127.0.0.1/packages.json(缺了中间斜杠) - 别依赖默认索引页——Satis 不生成
index.html,访问根路径/会 403 或 404,这不是错误,直接请求/packages.json即可
离线安装时 composer install 还报 “package not found”?
即使 Satis 构建成功、Web 服务正常,客户端仍可能找不到包,关键在三处大小写与禁用逻辑。
- 检查
packages.json里包名是否全小写(如"vendor/package"),而项目composer.json中require写成了"Vendor/Package"—— Composer 区分大小写 - 必须在项目级
composer.json中显式禁用 Packagist:"packagist.org": false,否则 Composer 仍会尝试联网查源 - 执行前清缓存:
composer clear-cache,否则 Composer 可能从旧缓存读取远程元数据,忽略你刚配的本地源
最易被忽略的一点:Satis 构建过程不校验私有仓库 clone 权限。如果某个 repositories 是私有 Git 地址,但构建机没配 SSH key 或 token,Satis 会静默跳过该包,不报错也不提示——最终 packages.json 里根本没它,而你完全不知情。

















