我刚刚开始使用 bower 来管理客户端依赖项。我已将 Bower 设置为将所有文件安装到/vendor/assets/components
.
然后我运行bower install
以评估bower.json
文件并安装所有依赖项
#/bower.json
{
"name": "My-App",
"dependencies": {
"angular": "1.0.8",
"bootstrap": "3.0.0"
}
}
最后,按照我读过的教程的指示,我已经从 GIT 中删除了 components 目录。
#.gitignore
#...
# Ignore all stuff manged by bower
/vendor/assets/components
因此,该项目在 slug 中不包含任何这些资产,并且需要bower install
运行才能安装它们。
这对我来说似乎是明智的,就像将实际的 gem 从项目中解耦是明智的一样。它还遵守12-factor app的原则,并明确声明和隔离依赖项。
但是,排除依赖项会导致资产编译阻塞......
但是,当我推送到 Heroku 时,资产预编译失败,因为尚未添加资产,因此当 sprockets 尝试评估时:
#application.css.scss
/* ...
*= require bootstrap/dist/css/bootstrap
*= require_self
*= require_tree .
*/
它发现没有任何东西可以找到,bootstrap/dist/css/bootstrap
因为 bower 还没有安装任何东西。
一种可能的解决方案 - 使用 package.json 运行安装后脚本
我已按照本教程进行操作,该教程建议添加package.json
包含以下内容的文件:
"dependencies": {
"bower": "0.6.x"
},
"scripts": {
"postinstall": "./node_modules/bower/bin/bower install"
}
但是bower install
,不需要作为安装后脚本运行,而是作为推送后、资产前编译脚本运行。我也不清楚 Heroku 是否会为 Rails 应用程序运行 npm 预处理器
弄清楚如何运行 bower install 还是仅在 GIT 中包含文件更好?
有两种解决方案。第一个也是最简单的方法是简单地在bower install
本地运行并将文件包含在 GIT 中。这没什么大不了的,但我想坚持 12 Factor App 的原则。
第二种解决方案是在资产预编译发生之前弄清楚如何启动 npm 并bower install
在 Heroku 上运行。
这是否以任何简单的方式可行,还是在本地简单地编译凉亭资产更好?
后记
最后我的结论是简单地在bower install
本地运行并将文件包含在 GIT 中。尽管 12 因素原则表明这可能不是正确的路线,但我发现它在实践中没有任何成本,我更喜欢这样做,而不是陷入自定义 buildpack 的复杂复杂性。