scripts字段必须位于composer.json根层级,与require、autoload同级;嵌套在extra或config中将被静默忽略,且不报错。

scripts 字段必须写在 composer.json 顶层,不能放错位置
很多人加完脚本发现完全不生效,根本原因是把 scripts 塞进了 extra、config 或 autoload 里。它必须和 require、autoload 同级,是 composer.json 的直接子键。
常见错误写法:"extra": { "scripts": { "build": "..." } } —— 这个 scripts 会被 Composer 完全忽略,无报错、无声无息。
正确结构示例:
{
"name": "my/app",
"require": { ... },
"autoload": { ... },
"scripts": {
"build": "php scripts/build.php",
"build-js": "npm run build"
}
}
编译任务推荐用独立 PHP 文件,别塞内联命令
源码编译往往涉及读写文件、调用类、处理异常、检查环境——这些在单行字符串脚本里极难维护,也容易因引号、空格、转义崩掉。
更可靠的做法是写一个可执行的 PHP 文件(如 scripts/build.php),并在顶部显式加载自动加载器:
<?php require __DIR__ . '/../vendor/autoload.php'; <p>use App\Compiler;<p>$compiler = new Compiler(); $compiler->compileSources();</p>
然后在 scripts 中调用它:"build": "php scripts/build.php"。
- 路径始终相对于项目根目录(即 composer.json 所在位置)
- 不要依赖
$_SERVER['argv'],用$argv接收参数,因为 Composer 会把脚本名也塞进第一个参数 - 如果需传参,命令行写成
composer run build -- --env=prod,PHP 脚本里用array_slice($argv, 2)提取
避免用 shell 命令做跨平台编译逻辑
像 "build": ["rm -rf dist/", "mkdir dist", "cp -r src/ dist/"] 在 Windows 上大概率失败:PowerShell 不认 rm,cp 行为不一致,路径分隔符也不同。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
除非你只跑 CI(且明确限定 Linux 环境),否则这类操作应交给 PHP 脚本完成。PHP 的 RecursiveDirectoryIterator 和 FilesystemIterator 是跨平台的,还能做内容过滤、哈希校验、符号链接处理等 shell 难以覆盖的细节。
如果你非要用 shell 工具,确保二进制来自 vendor/bin/(比如 vendor/bin/robocopy 或 vendor/bin/rsync),而不是系统 PATH,否则本地能跑、CI 里挂。
post-autoload-dump 是最常用的编译触发点
源码编译常依赖自动加载信息(比如扫描注解、生成代理类、收集配置元数据),而 post-autoload-dump 是 Composer 在生成或更新 vendor/autoload_*.php 后立即触发的钩子,时机精准、稳定可靠。
示例配置:
"scripts": {
"build": "php scripts/build.php",
"post-autoload-dump": [
"@build",
"echo 'Autoload updated, compilation complete.'"
]
}
注意:
-
post-autoload-dump不会在composer install初次运行时触发,除非已有vendor/autoload.php;首次安装后手动跑一次composer dump-autoload即可补上 - 如果编译过程修改了源码(如生成 stub 文件),要确保它们不被 Git 忽略,或在
.gitattributes中标记为 export-ignore - 别在
post-autoload-dump里调用composer dump-autoload,会引发无限递归
实际执行编译任务时,最容易被忽略的是工作目录继承机制和 autoload 加载时机——Composer 调用脚本时不会自动切到项目根目录,也不会帮你 require 自动加载器,这两点必须手动确认。










