composer config -g repo.packagist仅配置全局公开源代理,不影响私有仓库;私有包必须在项目composer.json的repositories数组中显式声明type: "composer"源、以/结尾的url、独立"packagist.org": false项,并确保satis生成的packages.json和dist/文件可被web服务正确访问。

为什么composer config -g repo.packagist不能用于私有仓库
这条命令只改元数据入口,不碰 ZIP 包下载路径。私有仓库的包(比如 acme/utils)若没在 packages.json 里注册,或 ZIP 文件不在 Web 可访问路径下,composer install 仍会卡在 dist.url 404 —— 它根本不会去你本地的 satis/web 目录找文件。
常见错误现象:Could not find package acme/utils 或 file could not be downloaded,其实不是网络不通,而是 Composer 根本没查你的私有源。
-
repo.packagist是给 packagist.org 做代理用的,只影响公开包;私有源必须显式声明在项目级composer.json的repositories数组里 - 私有源 URL 必须以
/结尾,否则拼出的packages.json路径是错的(如https://pkgs.internalpackages.json) - 必须加
"packagist.org": false,且放在repositories同一层,不是嵌套在某个仓库对象里
repositories 数组怎么写才真正生效
顺序和结构决定一切。Composer 按数组顺序查找包,第一个匹配就停,不会合并或 fallback。
典型正确写法:
{
"repositories": [
{
"type": "composer",
"url": "https://pkgs.internal/"
},
{
"type": "packagist.org",
"enabled": false
}
],
"require": {
"acme/utils": "^1.0"
}
}
- 私有源必须是
type: "composer",不是vcs或path;后者只适用于单个开发中包,不生成索引 -
"packagist.org": false必须作为独立项写进repositories数组,不能塞进前面那个对象里 - 如果已有其他仓库(比如 GitLab vcs 源),私有镜像源要放在第一位,否则
acme/utils这种包会被跳过
Satis 构建后 Nginx 怎么配才不 404
satis build 只写文件,不启动服务。404 不是构建失败,是 Web 服务没暴露对路。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
关键检查点:
- Nginx 的
root必须精确指向satis.json中output-dir的路径,例如root /var/www/satis/web;,少一级目录就 404 - 必须显式声明 JSON MIME 类型:
types { application/json json; },否则返回text/plain,Composer 直接拒收 - 确保
dist/下 ZIP 路径可直连 GET,比如https://pkgs.internal/dist/acme/utils/1.2.3/xxx.zip;SELinux 或chmod权限常锁死该路径 - 验证:手动
curl -I https://pkgs.internal/packages.json,看状态码是否 200、Content-Type是否为application/json
为什么 require-all: true 是个高危开关
它会让 Satis 把 Packagist 所有公开包全量同步,首构建可能超 40GB,内存溢出或超时是常态。
更隐蔽的问题:
- 把
dev-main、dev-feature/x这类分支也当正式版本暴露,composer update可能拉到不稳定代码 - 同步耗时长,期间任何 Git 仓库变更都无法及时反映,Satis 不监听也不自动重跑
- 建议用
"require": {"acme/utils": "*"}精确控制,配合"require-dependencies": true拉依赖
真正麻烦的从来不是配置几行 JSON,而是 ZIP 文件路径权限、Nginx MIME 类型、以及 repositories 数组里那一个错位的逗号。










