composer不管理js/css等静态资源,仅安装php包;bootstrap的css留在vendor/中,需通过post-install-cmd脚本复制或前端工具链构建才能进入public/目录。

Composer 本身不管理静态资源依赖,它只下载和安装 PHP 包。JS、CSS、字体等文件必须通过其他机制引入 public/ 或 dist/ 目录。
为什么 composer require 无法直接把 Bootstrap 的 CSS 拷到 public/css
因为 Composer 默认只处理 vendor/ 下的 PHP 类库:它不会读取包里的 dist/ 或 build/ 目录,也不会执行复制、链接或构建动作。即使你安装了 twbs/bootstrap 这样的包,它的 CSS 文件仍安静地躺在 vendor/twbs/bootstrap/dist/css/bootstrap.min.css —— 不会自动出现在 Web 可访问路径下。
- 所有“自动出现”的现象,都来自额外配置:比如
composer/installers插件、自定义scripts、或前端构建工具主动扫描vendor/ -
type字段(如"type": "library")在没有插件支持时完全无效;即使有插件,也缺乏社区统一约定,不同包行为不一致 - 直接修改
vendor/内文件是危险操作,下次composer update会被覆盖
post-install-cmd 脚本中用 cp 复制 JS/CSS 的实操要点
这是最轻量、无需额外工具链的方式,适合小型项目或遗留系统集成。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须用
post-install-cmd和post-update-cmd,不能只靠post-autoload-dump—— 后者触发时,vendor/中的包可能还没解压完成 - 路径判断必不可少:
if [ -d "vendor/package-name/dist" ]; then cp -r ...; fi,否则包没提供dist/就会中断整个composer install流程 - Linux/macOS 用
cp -r,Windows CI 环境需改用xcopy或启用 WSL,否则构建失败 - 避免
rm -rf public/vendor全量清理 —— 容易误删你自己维护的组件或上传的静态文件
示例脚本:
"scripts": {
"post-install-cmd": [
"if [ -d 'vendor/twbs/bootstrap/dist' ]; then mkdir -p public/vendor/bootstrap && cp -r vendor/twbs/bootstrap/dist/* public/vendor/bootstrap/; fi"
],
"post-update-cmd": [
"if [ -d 'vendor/twbs/bootstrap/dist' ]; then mkdir -p public/vendor/bootstrap && cp -r vendor/twbs/bootstrap/dist/* public/vendor/bootstrap/; fi"
]
}
用 npm + post-install-cmd 触发构建才是现代推荐做法
把前端资源管理交还给 npm/yarn/Vite,Composer 只做调度:这样能利用哈希文件名、Tree Shaking、Source Map 等能力,而不是手动搬运原始文件。
- 确保
package.json存在且含"build"脚本,例如"build": "vite build --outDir public/build" - 在
composer.json中写:"post-install-cmd": ["@php -r \"file_exists('package.json') && system((PHP_OS_FAMILY === 'Windows' ? 'npm.cmd' : 'npm') . ' ci && npm run build');\""],其中npm ci保证依赖与package-lock.json严格一致 - 构建产物(如
public/build/app.a1b2c3d4.js)必须加入.gitignore,绝不可提交 - 不要在
composer.json中重复声明前端库版本(如"npm-asset/jquery"),会导致 npm 和 Composer 两套版本策略冲突
真正容易被忽略的是:Composer 对静态资源没有“安装完成”的语义 —— 它只管 PHP 包是否落盘。JS/CSS 是否可用、是否最新、是否带哈希,全取决于你写的脚本是否健壮、是否适配不同操作系统、是否容错。一旦漏掉路径判断或忽略 Windows 兼容性,CI 就会在最意想不到的时候挂掉。










