--no-scripts 并不安全,仅跳过根 composer.json 的 scripts 钩子,无法阻止 autoload 文件执行、插件逻辑、dev 版本代码等风险。

composer install 时跳过 scripts 是不是就安全了
不是。忽略 --no-scripts 只能跳过 composer.json 中定义的 scripts(如 post-install-cmd),但无法阻止以下行为:
- 第三方包的
autoload文件中直接执行的代码(比如在vendor/autoload.php加载时触发的函数调用) - 依赖包的
install阶段通过composer-plugin注入的逻辑(插件本身不受--no-scripts控制) -
composer.lock中未锁定的分支/提交,或使用dev-版本时可能拉取未经审计的代码
哪些 scripts 会被 --no-scripts 真正跳过
它只影响 composer.json 的 scripts 字段中声明的钩子,且仅限于当前项目根目录下的配置(不递归处理 vendor 内部包的 scripts)。
典型被跳过的钩子包括:
-
pre-install-cmd和post-install-cmd -
pre-update-cmd和post-update-cmd -
post-autoload-dump(常见于 Laravel 的优化命令)
注意:--no-scripts 对 require 命令默认不生效,需显式加上该参数:
composer require monolog/monolog --no-scripts
生产环境推荐的组合参数
单靠 --no-scripts 不足以保障安装安全,应配合其他约束:
- 始终使用
--no-dev:避免安装require-dev中的非运行时依赖(它们常含调试、构建类脚本) - 强制校验 lock 文件:
--ignore-platform-reqs会绕过 PHP 扩展检查,慎用;更安全的是提前确认platform配置匹配目标环境 - 验证 lock 文件完整性:确保
composer.lock由可信 CI 流程生成,且未被篡改(可通过 Git 提交历史或签名验证)
标准生产部署命令示例:
composer install --no-dev --no-scripts --optimize-autoloader
如何确认 scripts 是否真的没执行
最直接的方式是加 -v(verbose)观察日志输出:
composer install --no-scripts -v
如果看到类似以下内容,说明仍有脚本在运行:
Executing command (CWD): php artisan clear-compiled
此时要排查原因:
- 是否误用了
composer update而非install?update默认读取composer.json,可能触发post-update-cmd - 是否全局配置了
scripts?检查COMPOSER_HOME/config.json或~/.composer/config.json - 是否用了自定义 installer(如
composer/installers)?它的行为独立于--no-scripts
真正想切断所有自动执行逻辑,唯一可靠方式是:不运行 composer install,改用离线解压 + 手动 autoload 生成(例如用 composer dump-autoload --classmap-authoritative 预生成后分发)。










