私有包必须显式声明源,不能依赖镜像代理;需在项目composer.json中配置repositories(vcs或composer类型)、auth.json认证及Satis元数据签名,三者缺一不可。

私有包必须显式声明源,不能靠镜像代理
直接把 packagist.org 镜像一遍,对 internal/erp-core 这类私有包完全无效——composer require internal/erp-core 仍会报 Could not find package。因为 packagist.org 根本不托管私有包,也不支持权限控制,镜像只是缓存公开包而已。
真正起作用的是三层组合:repositories 声明 + 认证凭证 + 元数据控制(如 Satis 的 provider-list 签名)。企业 ERP 系统里,internal/erp-auth、internal/finance-sdk 这类核心包必须在项目级 composer.json 中显式写死源:
{
"repositories": [
{
"type": "vcs",
"url": "https://gitlab.internal/php/erp-auth.git"
},
{
"type": "composer",
"url": "https://packages.erp.corp"
}
],
"require": {
"internal/erp-auth": "^3.2",
"monolog/monolog": "^3.0"
}
}
-
type: "vcs"直接对接 Git,适合高频迭代的内部 SDK;type: "composer"指向 Satis/Nexus,适合 ZIP 分发、需签名验证的生产包 - 绝不要在
repositories里写"packagist.org": false——它只禁用默认源,不阻止 Composer fallback 到其他可用源 - 全局镜像配置(
composer config -g repo.packagist)必须清空,否则 CI 构建时可能漏掉私有源认证
CI/CD 中必须强制 --no-dev 且 lock 文件干净
ERP 系统上线后若混入 phpunit/phpunit 或 symfony/var-dumper,轻则体积膨胀 50%,重则暴露 /_profiler 调试入口、触发 Class not found 错误。但 --no-dev 不是万能开关:
-
composer.lock若由未加--no-dev的composer update生成,里面仍存 dev 包记录,部署时install --no-dev会跳过安装,但旧版 Composer 可能仍尝试解压 autoload-dev 路径 -
vendor/composer/autoload_dev.php文件若残留,HTTP 请求中调用dump()会直接 fatal error -
COMPOSER_NO_DEV=1这类环境变量不能设在 Dockerfile 全局 ENV 里,否则本地调试也会失败
CI 流程必须分两步:先 composer update --no-dev --lock 提交新 composer.lock,再 composer install --no-dev --optimize-autoloader;Docker 构建中应显式写全参数,避免依赖环境变量。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Satis 元数据必须绑定 Git Tag + Basic Auth
Satis 是最可控的私有元数据生成器,但它本身不处理认证、不监听 Git 变更、不校验签名。ERP 核心包如 internal/erp-inventory 打了 v2.1.0 tag 后,若 Satis 没重建 provider-list,composer update 就拉不到新版本。
- 构建脚本必须显式触发
satis build并指定--skip-errors和--no-interaction - Satis 服务必须启用 Basic Auth(如 Nginx 的
auth_basic),且凭证通过composer config http-basic packages.erp.corp user pass注入,不能硬编码在composer.json里 - provider-list JSON 必须带
providers-signature字段,CI 中用openssl dgst -sha256校验签名一致性
插件和脚本必须按需白名单控制
ERP 系统里,composer install 触发的插件可能读取 .env、连接数据库、甚至执行 exec()。Composer 自 2.4.2 起默认禁用超级用户下的插件,但企业环境常需例外:
- 禁用所有插件:运行
composer install --no-plugins --no-scripts,适合部署阶段 - 白名单授权:在
composer.json中设"allow-plugins": { "composer/installers": true, "phpstan/extension-installer": true },其他一律拒绝 - 绝对禁止在
post-install-cmd中调用混淆工具(如php-obfuscator)处理 vendor 里的第三方包——这会破坏 autoload 规则,且无法更新
最关键的不是“能不能装”,而是“装完谁有权跑”。Satis 生成的 provider-list 若没签名,或 Satis 服务没配 Basic Auth,再严格的 repositories 声明也形同虚设——认证和元数据控制必须由你手动补全,缺一不可。

















