post-install-cmd 是 composer 在 composer install 完成依赖安装后自动触发的脚本钩子,适用于生成 autoload、清理缓存、复制配置模板等轻量初始化;需在 composer.json 的 scripts 下声明为数组,避免单字符串解析错误,且不执行于 --no-scripts 模式。

post-install-cmd 是什么,什么时候该用它
post-install-cmd 是 Composer 在执行 <code>composer install 完成依赖安装后自动触发的脚本钩子。它不适用于首次克隆项目后直接运行(因为没 vendor/),也不在 composer update 时默认触发——除非显式加 --with-dependencies 或配置了 post-update-cmd。
常见使用场景包括:生成 autoload 文件、清理缓存、复制配置模板、检查环境变量是否就位。它不是部署脚本的替代品,但适合“让项目开箱即用”的轻量初始化。
在 composer.json 中正确声明 post-install-cmd
必须把命令写在 "scripts" 下的 "post-install-cmd" 字段里,值可以是字符串或数组:
{
"scripts": {
"post-install-cmd": [
"@php -r \"file_put_contents('runtime/.installed', date('c'));\"",
"php artisan config:clear",
"php bin/generate-config.php"
]
}
}
注意几点:
- 数组形式更安全,避免 shell 解析歧义
- 每个条目单独执行,失败会中断后续(除非加
|| true,但不推荐掩盖问题) - 不要写成
"post-install-cmd": "php artisan key:generate"这种单字符串——容易因空格、引号崩掉 - 如果命令依赖 vendor/bin 下的二进制(如
phpunit),确保它已在require-dev中声明,否则composer install --no-dev时会报Command not found
为什么 post-install-cmd 有时不执行
最常踩的坑是用了 composer install --no-scripts(CI 环境常默认加这个)。只要加了这个 flag,所有脚本钩子都会静默跳过,包括 post-install-cmd。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
其他原因包括:
-
composer.json格式错误导致解析失败(可用composer validate检查) - 命令中调用了未安装的 PHP 扩展(比如
php -m | grep mbstring缺失,而脚本里用了mb_strtolower()) - 使用了相对路径,但当前工作目录不是项目根目录(Composer 执行脚本时 cwd 是
composer.json所在目录,这点很关键)
和 post-autoload-dump 的区别与协作
post-install-cmd 在依赖解包、vendor/autoload.php 生成之后运行;而 post-autoload-dump 只在 autoloader 重建时触发(比如改了 autoload 配置或运行 composer dump-autoload)。
如果你的脚本需要加载项目类(比如调用 App\Console\Installer::run()),别急着在 post-install-cmd 里 require 'vendor/autoload.php'——此时 autoload 文件已存在,但类映射可能还没刷进去。稳妥做法是:
- 把类初始化逻辑放进一个独立脚本(如
bin/init-project.php) - 在
post-install-cmd中调用它,并确保它不依赖尚未生成的 classmap - 或者拆成两步:
post-autoload-dump触发类加载准备,post-install-cmd执行业务逻辑
实际项目里,这两个钩子经常一起出现,但职责必须分清:一个是“环境就绪”,一个是“代码可加载”。混淆它们,很容易遇到 Class not found 却查不出原因。










