必须在项目级composer.json顶层写"packagist": false(非packagist.org),配合repositories显式声明镜像源,否则禁用无效;全局config设false会触发错误,repositories内写该字段被忽略,且所有依赖(含间接)须提前同步至私有源。

不能靠“白名单作者”或“局部禁用”实现,必须用 repositories + "packagist": false 组合,且所有依赖(含嵌套)都得提前同步进你的私有源,否则直接失败。
为什么 "packagist.org": false 必须写在项目级 composer.json 顶层
全局配置 composer config --global repo.packagist false 实际会把 URL 设成布尔 false,触发 Invalid repository url "false" 错误;而 config 块或 repositories 数组里写这个字段,Composer 完全忽略。只有和 require、autoload 同级的 "packagist": false(注意不是 packagist.org)才真正生效。
常见错误:
- 写成
"packagist.org": false—— 旧版兼容写法,v2.9+ 已不推荐,部分镜像服务不识别 - 写在
"repositories": [{ "packagist": false }]里 —— 被当做一个空仓库,禁用逻辑不触发 - 没运行
composer update --lock—— 旧composer.lock仍含 packagist.org 来源,安装时悄悄回退
repositories 中怎么精确控制某个包只走内网源
不能只靠顺序或类型模糊匹配。要确保特定包(比如 myorg/internal-sdk)100% 不从任何外部源拉取,唯一可靠方式是用 package 类型仓库手动声明它:
示例配置片段:
{
"packagist": false,
"repositories": [
{
"type": "package",
"package": {
"name": "myorg/internal-sdk",
"version": "3.2.1",
"dist": {
"url": "https://packages.mycompany.com/dist/myorg-internal-sdk-3.2.1.zip",
"shasum": "a1b2c3..."
}
}
},
{
"type": "composer",
"url": "https://packages.mycompany.com/"
}
],
"require": {
"myorg/internal-sdk": "^3.2"
}
}
关键点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
package类型仓库优先级最高,一旦匹配到 name + version,Composer 就不会查其他源 -
dist.url必须指向你可控的 HTTPS 地址,且返回的 ZIP 包需带有效shasum字段,否则跳过校验 - 如果该包有子依赖,它们也必须出现在你私有源中——
package只管当前包,不管它的require
CI 流程中如何防住开发人员绕过限制
光靠配置不够,人可以手动改 composer.json 或加新包。必须在 CI 构建阶段做硬性拦截:
检查项示例(Shell 脚本):
- 用
grep -q '"repositories"' composer.json确认没漏掉自定义源声明(哪怕只是注释里的残留) - 执行
composer config --list | grep 'repo\.packagist',输出必须为repo.packagist [null]或显式指向企业源 - 扫描
composer.json的require和require-dev,用jq提取所有 vendor 名称,再grep -vE '^(myorg|acme)/',命中即中断构建 - 运行
composer install --dry-run --no-plugins,捕获输出里是否出现packagist.org或未授权域名
注意:require-dev 容易被忽略,但测试工具如 phpunit/phpunit 若没同步进私有源,--no-dev 也不能救——因为 Composer 解析阶段就要读所有 composer.json 元数据。
私有源没同步全导致安装失败,该怎么快速定位
报错信息通常只说 Could not find package xxx/yyy,但不告诉你缺的是哪一层依赖。这时候别急着补包,先用命令缩小范围:
-
composer depends xxx/yyy查谁引入了它 -
composer show xxx/yyy --all看是否返回元数据;如果返回空,说明你的私有源根本没收录这个包(或版本不匹配) -
composer update --dry-run -v加详细日志,观察最后请求的是哪个packages.json,确认是否卡在私有源的 404
最常被漏同步的是“间接依赖”:比如你只同步了 myorg/sdk,但它 requires monolog/monolog,而你没同步 monolog 的对应版本,安装就崩。这类问题必须靠 CI 扫描 composer.lock 中所有 packages 列表,比对私有源已知包清单。










