我可以在Heroku上使用Bower和Rails并仍然保留bower_components目录而不是GIT吗?

时间:2013-10-23 14:05:09

标签: ruby-on-rails node.js heroku bower

我刚开始使用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还没有安装任何东西。

一种可能的解决方案 - 使用package.json运行安装后脚本

我已按照this tutorial建议添加package.json文件,其中包含以下内容:

"dependencies": {
    "bower": "0.6.x"
},
"scripts": {
    "postinstall": "./node_modules/bower/bin/bower install"
}

但是bower install需要不是作为安装后脚本运行,而是作为推后的资产前编译脚本运行。我也不清楚Heroku是否会为Rails应用程序运行npm预处理器

最好弄清楚如何运行bower安装或只是在GIT中包含文件?

这有两个解决方案。第一个也是最简单的是在本地运行bower install并将文件包含在GIT中。这不是什么大问题,但我想坚持12 Factor App的原则。

第二个解决方案是在资产预编译发生之前弄清楚如何启动npm并在Heroku 上运行bower install

这是否可以以任何简单的方式实现,还是在本地简单地编译bower资产更好?

后记

我最后的结论只是在本地运行bower install并将文件包含在GIT中。虽然12因素原则表明这可能不是正确的路线,但我没有发现它在实践中有任何成本,并且更倾向于不是进入自定义构建包的复合复杂性。

1 个答案:

答案 0 :(得分:3)

您应该尝试使用ddollar's multi-buildpack。安装两个buildpack时,您可以获得额外的好处,即能够在安装nodejs之后运行postinstall脚本,但安装ruby buildpack之前。这样,您就可以在预编译之前使用bower install下拉资产。

我已经制作了一个专门讨论如何处理Heroku + Rails + Bower场景的原型。

https://coderwall.com/p/6bmygq