ruby-on-rails - 我可以在 Heroku 上使用 Bower 和 Rails 并且仍然将 bower_components 目录保留在 GIT 之外吗?

标签 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 中包含任何这些 Assets ,需要运行 bower install 才能安装它们。

这对我来说似乎是明智的,就像将实际的 gem 与项目分离是明智的一样。它还遵守12-factor app的原则。并且显式声明和隔离依赖关系

但是,排除依赖项会导致 Assets 编译阻塞...

然而,当我推送到 Heroku 时, Assets 预编译失败,因为 Assets 尚未添加,所以当 sprockets 尝试评估时:

#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 需要运行的不是安装后脚本,而是推送后、 Assets 编译前脚本。我也不清楚 Heroku 是否会为 Rails 应用程序运行 npm 预处理器

是弄清楚如何运行 bower install 还是只在 GIT 中包含文件更好?

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

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

这是否以任何简单的方式可行,还是在本地简单地编译 bower Assets 更好?

后记

我最后的结论是简单地在本地运行 bower install 并将文件包含在 GIT 中。尽管 12 因素原则表明这可能不是正确的路线,但我没有发现它在实践中有任何成本并且更喜欢它而不是进入自定义 buildpack 的复合复杂性。

最佳答案

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

我整理了一个提示,介绍如何处理 Heroku + Rails + Bower 场景。

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

关于ruby-on-rails - 我可以在 Heroku 上使用 Bower 和 Rails 并且仍然将 bower_components 目录保留在 GIT 之外吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19543950/

相关文章:

ruby-on-rails - 嵌套属性 + 多重选择 : Couldn't find Collection with ID= ["1", "2", "3"] 对于 ID=? 的产品

ruby-on-rails - 如何使用 aws 弹性负载均衡器将 http 请求强制重定向到旅客独立中的 https?

ruby-on-rails - 获取 ActiveRecord 对象中的属性类型

heroku - 从 '@babel/plugin-proposal-decorators' 找不到模块 '/app'

ruby-on-rails - 从事件记录关系获取模型类

javascript - 混合 Node 和 amd 模块时 requirejs() 返回未定义

node.js - Azure部署Mongo错误: Authentication failed

node.js - 如何使用 express-session 生成自定义 session ID?

php - 如何防止用户操纵文件系统

ruby-on-rails - rails 3,Heroku : Taps Server Error: PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xba