应使用--ignore-platform-req=php精准跳过php版本检查,而非全局设composer_ignore_platform_reqs=1;后者仅跳过校验却不解决运行时兼容性问题,易致生产环境崩溃,推荐用config.platform声明目标环境以保障依赖一致性。

怎么用 COMPOSER_IGNORE_PLATFORM_REQS 但不踩坑
直接设 COMPOSER_IGNORE_PLATFORM_REQS=1 能绕过 PHP 版本、扩展缺失等检查,但它不是部署方案,而是临时逃生通道。真正在生产环境用它,等于主动放弃兼容性兜底。
- 只应在 CI 构建阶段配合
--ignore-platform-reqs使用,且必须同步验证最终运行环境是否满足真实依赖(比如你忽略ext-gd,但代码里调了imagecreatefrompng(),上线就 fatal error) - 不要在
composer.json的config里写"platform-check": false来全局禁用——这会让composer install在低版本 PHP 上静默装错包,比报错更危险 - 更安全的替代:用
config.platform显式声明目标环境能力,例如:"config": { "platform": { "php": "8.1.0", "ext-gd": "8.1.0", "ext-mbstring": "8.1.0" } }这样 Composer 会按你声明的“虚拟平台”解析依赖,既跳过本地检查,又不牺牲一致性
preferred-install 配置写在哪才生效
它必须写进项目根目录的 composer.json 的 config 对象里,命令行参数和环境变量都无效。改完不用重启,下次 composer install 就自动按新规则走。
- 写成
"preferred-install": "dist":所有包优先下 zip 包,快且干净;但若某私有包没提供dist字段(比如 GitLab 仓库未启用 archive),Composer 会悄悄 fallback 到source,你根本不知道 - 写成对象形式最可控:
"preferred-install": { "acme/*": "source", "*": "dist" }自家命名空间走源码(方便调试),第三方包一律用 dist(构建稳定) - 注意:
"*"是前缀匹配,"myorg/monolog"不会匹配"monolog/monolog";也不能写成"*/monolog",语法不合法
如何跳过特定包安装,而不是全删 vendor/
想让某个包完全不进 vendor/,靠 --no-dev 或 require-dev 移动不管用——只要它在 require 里,就会被装。真正有效的只有两种方式:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用
replace声明该包已被替代:"replace": { "monolog/monolog": "*" }Composer 会认为它已存在,跳过安装(适合你用自建 fork 替代官方包) - 用
provide声明能力已具备:"provide": { "psr/log-implementation": "1.0.0" }告诉 Composer “日志接口我自有实现”,就不会再拉monolog这类实现包 - 别用
COMPOSER_IGNORE_PLATFORM_REQS=1来“假装”跳过——它只跳检查,不跳安装,包照样下进来,只是可能无法运行
部署时清理 vendor/ 的关键项有哪些
composer install --no-dev --optimize-autoloader 只是起点,真正上线前必须手动删掉这些内容,否则等于把开发攻击面一起发布:
-
vendor/bin/:全部删掉。除非你明确需要phinx或php-cs-fixer在线上运行,否则留着就是风险入口 -
vendor/**/tests/、vendor/**/Tests/、vendor/**/test/、vendor/**/Test/:递归删,别信 glob 通配能覆盖全,Linux/macOS 下推荐:find vendor -path '*/tests' -o -path '*/Tests' -o -path '*/test' -o -path '*/Test' -type d -prune -exec rm -rf {} + -
vendor/**/{.git,.github,.travis.yml,phpunit.xml,psalm.xml,phpstan.neon}:这些文件不参与运行,但泄露项目结构、CI 配置甚至测试用例逻辑 -
vendor/composer/installed.json:含所有包完整版本号与哈希值,攻击者可据此精准判断是否存在已知漏洞
自动化脚本里别依赖模糊匹配;rm -rf 显式列出路径,漏删比多删更危险。










