局域网部署composer私有仓库首选satis,因其无数据库、无服务、仅生成静态文件,可直接由nginx/apache托管并被composer install拉取;vcs直连gitlab在多项目协作中易失控,存在凭证分散、域名/token变更需全量修改、无法统一管控版本与审计等缺陷。

局域网内部署 Composer 私有仓库,首选 Satis —— 它不依赖数据库、不跑服务、只生成静态文件,部署到任意 Web 服务器(Nginx/Apache)就能被 composer install 直接拉取,且完全离线运行。
为什么不用 VCS 直连 GitLab?
VCS 方式(直接在 repositories 里写 "type": "vcs")看似简单,但在局域网多项目协作场景下会迅速失控:
- 每个项目都要单独配
auth.json或 SSH 密钥,CI/CD 流水线需重复注入凭证 - GitLab 域名变更、Token 过期、分支重命名时,所有项目
composer.json都得手动改 - 无法统一控制包可见性(比如禁止 dev 分支被 require)、无法做版本归档(
dist)、无法审计谁装了什么 -
composer update会实时访问 GitLab API,一旦 GitLab 临时不可达,整个构建就卡住
satis.json 最小可用配置怎么写?
关键不是“功能全”,而是“能被 composer install 正确识别”。以下是最简但必含的三要素:
-
name:纯展示用,任意字符串,如"Internal PHP Packages" -
homepage:必须是完整 URL,且结尾不带斜杠,如"http://packages.internal"(注意不是"http://packages.internal/") -
repositories:顶层数组,每项显式写"type": "vcs",URL 必须可git clone,例如"https://git.internal/acme/utils.git"(缺.git后缀会失败)
示例(保存为 satis.json):
{
"name": "Internal PHP Packages",
"homepage": "http://packages.internal",
"repositories": [
{"type": "vcs", "url": "https://git.internal/acme/utils.git"},
{"type": "vcs", "url": "https://git.internal/biz/core.git"}
],
"require-all": true
}
build 后哪些文件必须可 HTTP 访问?
执行 php bin/satis build satis.json web/ 后,Satis 生成的是纯静态资源。Composer 客户端只会 GET 两个路径:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
http://packages.internal/packages.json(主索引,必须存在且返回 200) -
http://packages.internal/dist/{vendor}/{name}/{hash}.zip(如果配置了archive)
常见错误:
- Nginx 配置漏掉
location / { try_files $uri $uri/ /index.html; },导致/packages.json404 - Web 根目录设成
web/,但实际访问地址是http://packages.internal/web/packages.json—— Composer 不会自动补/web/,必须让/packages.json路径真实存在 -
packages.json文件权限为 644,但内容为空或 JSON 格式错误(检查web/packages.json是否有合法 JSON,且"packages"字段非空)
客户端项目如何安全接入?
项目 composer.json 里两件事必须同时做,缺一不可:
- 显式声明私有源:
"repositories"里加一条{"type": "composer", "url": "http://packages.internal/"}(注意结尾无斜杠) - 禁用 Packagist 回退:
"packagist.org": false放在"repositories"数组最末尾,否则 Composer 仍会尝试连外网
完整示例片段:
{
"repositories": [
{"type": "composer", "url": "http://packages.internal/"},
{"packagist.org": false}
],
"require": {
"acme/utils": "^1.2"
}
}
最后提醒:Satis 不支持增量更新,satis build 每次都是全量扫描。如果私有 Git 仓库数量超过 20 个,建议用 cron 定时构建,并把 satis.json 纳入版本管理——配置本身才是真正的“仓库定义”,而不是 Git 地址列表。










