我刚开始使用bower来管理客户端依赖项。我已将Bower设置为将所有文件安装到/vendor/assets/components
。
然后我运行bower install
来评估bower.json
文件并安装所有依赖项
#/bower.json
{
"name": "My-App",
"dependencies": {
"angular": "1.0.8",
"bootstrap": "3.0.0"
}
}
最后,按照我读过的教程的指示,我从GIT中删除了组件目录。
#.gitignore
#...
# Ignore all stuff manged by bower
/vendor/assets/components
因此,项目不会在slug中包含任何这些资产,并且需要运行bower install
才能安装它们。
这对我来说似乎是明智的,就像将项目中的实际宝石分离是明智的一样。它还遵守12-factor app和明确声明和隔离依赖的原则。
然而,当我推送到Heroku时,资产预编译失败,因为尚未添加asssets,所以当链轮尝试评估时:
#application.css.scss
/* ...
*= require bootstrap/dist/css/bootstrap
*= require_self
*= require_tree .
*/
它发现在bootstrap/dist/css/bootstrap
中找不到任何东西,因为bower还没有安装任何东西。
我已按照this tutorial建议添加package.json
文件,其中包含以下内容:
"dependencies": {
"bower": "0.6.x"
},
"scripts": {
"postinstall": "./node_modules/bower/bin/bower install"
}
但是bower install
需要不是作为安装后脚本运行,而是作为推后的资产前编译脚本运行。我也不清楚Heroku是否会为Rails应用程序运行npm预处理器
这有两个解决方案。第一个也是最简单的是在本地运行bower install
并将文件包含在GIT中。这不是什么大问题,但我想坚持12 Factor App的原则。
第二个解决方案是在资产预编译发生之前弄清楚如何启动npm并在Heroku 上运行bower install
。
这是否可以以任何简单的方式实现,还是在本地简单地编译bower资产更好?
我最后的结论只是在本地运行bower install
并将文件包含在GIT中。虽然12因素原则表明这可能不是正确的路线,但我没有发现它在实践中有任何成本,并且更倾向于不是进入自定义构建包的复合复杂性。
答案 0 :(得分:3)
您应该尝试使用ddollar's multi-buildpack。安装两个buildpack时,您可以获得额外的好处,即能够在安装nodejs之后运行postinstall脚本,但安装ruby buildpack之前。这样,您就可以在预编译之前使用bower install
下拉资产。
我已经制作了一个专门讨论如何处理Heroku + Rails + Bower场景的原型。