composer.json 的 scripts 字段不应滥用为多语言构建入口,仅限确定性高、失败即中止的PHP任务;跨语言构建须由Makefile/GitHub Actions等上层工具调度,vendor/与node_modules/必须物理隔离且路径独立。

composer.json 的 scripts 字段不是万能胶水
很多人把 scripts 当成执行任意命令的入口,往里塞 npm install、python -m build 甚至 make dist,结果 CI 报错时根本分不清是 PHP 依赖没装好,还是前端构建卡在某个 node-gyp 编译上。Composer 的脚本本质是 PHP 进程调用 shell 命令,它不接管子进程的错误码透出、信号传递或超时控制。
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 只在
scripts中触发**确定性高、失败即中止**的动作,比如php-cs-fixer fix或phpstan analyse - 跨语言构建(如 JS 打包、Python wheel 生成)应移出
scripts,改由 Makefile / GitHub Actions / npm run script 等上层工具统一调度 - 如果非要在
composer.json里声明,必须用&&链式调用并显式检查返回值,例如:"build-js": "cd assets && npm ci && npm run build || exit 1"
vendor/ 和 node_modules/ 必须物理隔离
常见错误是把 node_modules/ 放进 vendor/ 目录,或者反过来把 vendor/ 挂载进 Node 容器——这会直接破坏 Composer 的自动加载路径映射,也会让 npm 的符号链接机制误判依赖层级。更危险的是,Web 服务器若误将 vendor/ 或 node_modules/ 暴露到公网,等于白送攻击者源码和依赖树。
实操建议:
-
vendor/和node_modules/必须位于不同根路径下,典型结构是:./vendor/(PHP)、./assets/node_modules/(JS)、./scripts/venv/(Python) - 前端构建产物(如
public/build/app.js)应通过配置驱动引入,PHP 模板里不要硬写../node_modules/xxx/dist/xxx.js - CI 流程中,先
composer install --no-dev,再cd assets && npm ci && npm run build,两步独立执行、独立校验
多工具子目录项目别合并 vendor
当你有 ./tools/mailchimp/、./tools/calendly/ 这类独立小工具时,每个目录自带 composer.json 和 vendor/ 是合理设计,不是冗余。强行拉到根目录共用一个 vendor/,会导致 guzzlehttp/guzzle:^6.5 和 ^7.5 冲突、PSR-4 自动加载路径错乱、CI 构建时无法单独发布某一个工具。
实操建议:
- 保持各子目录 vendor 独立,部署时分别执行
cd tools/mailchimp && composer install --no-dev - 公共逻辑(如 HTTP 封装、日志适配)抽成私有 Composer 包,用 VCS Repository 方式复用,而不是靠路径拼接或手动拷贝
- 根目录的
composer.json只用于管理这些私有包本身,不参与任何子工具的运行时依赖
构建产物路径必须由配置而非约定决定
很多团队靠“大家都知道输出在 public/dist/”来衔接前后端,但一旦某次 Webpack 配置改了 output.path,PHP 模板就炸了;或者 Laravel Mix 升级后默认输出路径变更,没人发现直到上线报 404。
实操建议:
- 在
composer.json的extra字段声明构建目标,例如:"extra": {"frontend-dist": "public/build"} - 前端构建脚本读取该值(可用
jq -r '.extra."frontend-dist"' composer.json),动态传给打包工具 - PHP 中封装
asset()辅助函数,内部读取同一配置,确保模板里写的路径永远和实际产出一致

















