核心是显式声明repositories的type和url,并全局禁用packagist.org:漏写type会导致源被忽略且无提示;type只能为vcs/composer/package;Git URL须带.git后缀;Satis URL须指向packages.json;执行composer config --global repo.packagist.org false才能彻底隔离供应链风险。

企业级 PHP 项目用 Composer 管理中文包(或任何私有包),核心不是“支持中文”,而是确保私有源可发现、可验证、可隔离。直接结论:repositories 必须显式声明 type 和 url,且全局禁用 packagist.org 才算真正落地。
为什么 composer require vendor/private-package 总提示 “Could not find package”
常见错误是只在 composer.json 的 repositories 里写了 URL,漏掉 type 字段。Composer 会直接忽略该源,不报错也不警告。
-
type只能是vcs(Git/SVN)、composer(Satis/Artifactory)、package(单包定义),不能为空或拼错(比如写成git或private) - Git 类型必须带
.git后缀,例如https://gitlab.example.com/group/private-package.git,否则不被识别为vcs - Satis 类型的 URL 必须指向
packages.json,不是首页,例如https://satis.example.com/packages.json - HTTP(S) 源需确保 CLI 能访问——SSH key、PAT token、或 Basic Auth 都得配在 URL 里(如
https://token:x-oauth-basic@gitlab.example.com/...)
如何彻底禁用 Packagist 防止供应链攻击
光在项目级 composer.json 里加 "packagist.org": false 不够。默认 fallback 机制仍可能命中公共源,尤其当私有源响应慢或超时。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
composer config --global repo.packagist.org false,这是唯一可靠的全局隔离方式 - CI 流水线中必须校验该配置是否生效:
composer config --list | grep 'repo.packagist.org'输出应为false - 禁用后,所有依赖必须明确出现在你配置的私有源中,
composer install会直接失败——这不是 bug,是强制审计入口 - 别依赖
composer.lock的content-hash防篡改;它只校验依赖树结构,不校验 dist 文件内容
部署时 --no-dev 为什么不能省,哪怕 COMPOSER_ENV=prod
COMPOSER_ENV 环境变量对 Composer 行为无影响,仅部分框架读取。生产镜像里混入 require-dev 包,轻则浪费空间,重则暴露调试接口。
-
debug-bundle启用后可能泄露堆栈、环境变量甚至源码 -
maker-bundle的命令类若被自动注册,bin/console在生产环境也可能执行,路由未关严就等于开放后门 - Dockerfile 中应固定写法:
composer install --no-interaction --optimize-autoloader --no-dev -
--optimize-autoloader把 PSR-4 映射转成静态数组,启动快 10%–20%,且和--no-dev无冲突
composer install 和 composer update 到底该用哪个
上线和 CI 构建必须用 composer install;本地开发改依赖才用 composer update。两者逻辑完全不同,混用必出问题。
-
composer install严格按composer.lock安装,版本完全一致,适合部署 -
composer update忽略 lock,重新解析composer.json并生成新 lock,只应在审查变更后使用 - CI 脚本里必须检查
composer.lock是否已提交且未被.gitignore排除,否则缓存可能命中旧 lock - 只想升级单个包?用
composer update vendor/package-name,避免连带升级引发意外 break
私有包管理最易被忽略的点:dist 文件的 shasum 校验只在 --prefer-dist 下触发,而 Git 源默认走 source(clone),跳过校验。若要强制校验,需在 repositories 中加 "no-api": true 并确保服务端返回有效 dist.shasum 字段。

















