6

我刚刚开始使用 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 的复杂复杂性。

4

1 回答 1

3

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

我整理了一个关于如何处理 Heroku + Rails + Bower 场景的提示。

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

于 2013-11-08T22:16:36.187 回答