javascript - 尝试使用 browserify-rails 时 Assets 编译失败

标签 javascript ruby-on-rails ruby node.js heroku

我正在开发一个 Ruby on Rails 4.x 项目,我想使用 browserify-rails gem,这样我就可以在我的一些 JavaScript 文件中使用 CommonJS。这在开发期间在本地运行良好,但 Assets 编译在 Heroku 上失败。第一个问题是 Heroku Ruby 构建包将 Node 0.4.7 添加到 /app/bin 并且它首先出现在 PATH 环境变量中。这破坏了 browserify。我更改为不执行此操作的 Ruby buildpack,所以现在我的 .buildpack 文件如下所示:

https://github.com/PROJECT_NAME_HERE/heroku-buildpack-vendorbinaries.git
https://github.com/heroku/heroku-buildpack-nodejs
https://github.com/cymen/heroku-buildpack-ruby.git

尝试编译使用 CommonJS require 的 JavaScript Assets 时的错误(因此触发 browserify-rails):

   rake aborted!
   Error while running `/tmp/build_a95a51d0-fdb1-4035-ad56-97c40f738540/node_modules/.bin/browserify --list`:
   /usr/bin/env: node: No such file or directory
   (in /tmp/build_a95a51d0-fdb1-4035-ad56-97c40f738540/app/assets/javascripts/designer.js)/tmp/build_a95a51d0-fdb1-4035-ad56-97c40f738540/vendor/bundle/ruby/2.0.0/bundler/gems/browserify-rails-f3df1d20b466/lib/browserify-rails/browserify_processor.rb:92:in `run_browserify'
   /tmp/build_a95a51d0-fdb1-4035-ad56-97c40f738540/vendor/bundle/ruby/2.0.0/bundler/gems/browserify-rails-f3df1d20b466/lib/browserify-rails/browserify_processor.rb:40:in `dependencies'
   /tmp/build_a95a51d0-fdb1-4035-ad56-97c40f738540/vendor/bundle/ruby/2.0.0/bundler/gems/browserify-rails-f3df1d20b466/lib/browserify-rails/browserify_processor.rb:33:in `asset_dependencies'
   /tmp/build_a95a51d0-fdb1-4035-ad56-97c40f738540/vendor/bundle/ruby/2.0.0/bundler/gems/browserify-rails-f3df1d20b466/lib/browserify-rails/browserify_processor.rb:13:in `evaluate'
   ...

看来 Node 二进制文件在 Ruby on Rails 构建步骤中不可访问。这是因为 Node 位于 Ruby buildpack 的 PATH 设置不包括 /app/vendor/node/bin/node 的位置吗?我尝试将 postinstall 添加到 packages.json 中,如下所示:

...
"scripts": {
    "postinstall": "ln -s /app/vendor/node/bin/node /app/bin/node"
}
...

但这并没有帮助。接下来,我将尝试深入研究我 fork 的 ruby​​ buildpack,看看我是否可以修改路径。但这是一个非常缓慢的过程,部署到 Heroku 的往返时间很长,所以如果其他人知道出了什么问题,我很想知道!

最佳答案

所以答案是:

当 Heroku 像我们一样使用多构建包构建时,所有构建都发生在 /tmp 中的随机目录中。并且不会将任何内容放入常规目录中,例如 /app直到整个构建完成。我的问题的解决方案是:

  1. Heroku Ruby buildpack
  2. 删除旧 NodeJS 0.4.7 二进制文件中的构建,或者 fork 一个已经删除它的构建包 (mattwalters heroku-buildpack-ruby)
  3. 编辑 .buildpacks 并确保您在 Ruby buildpack 之上拥有 Heroku NodeJS buildpack
  4. 更新 heroku-buildpack-ruby,以便它更新在 slug 编译期间使用的 PATH,以包含在 /tmp 中创建的 NodeJS 目录。通过 Heroku NodeJS buildpack

为了让事情更简单,我 fork 了mattwalters Heroku Ruby buildpack 并添加了更新路径的代码:https://github.com/cymen/heroku-buildpack-ruby

最终结果是,当 Assets 编译发生在在 slug 编译期间时,PATH 现在有一个最新的 NodeJS 二进制文件,这样 browserify-rails 就可以工作了!请注意,browserify-rails 仍然非常粗糙,因此您可能需要对其进行自定义调整以使其正常工作(I have a fork that excludes vendor and jasmine from modularization)。

另一种方法是使用常用的 Heroku Ruby buildpack,但请按照“Hacking”下的指南使用您自己的 NodeJS 版本:Hacking

关于javascript - 尝试使用 browserify-rails 时 Assets 编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873638/

相关文章:

javascript - 我怎样才能将我的jquery变量值打印到div中,但是我在名为count的变量中得到了我的值

javascript - Aurelia 和 Select2 更改事件

ruby-on-rails - 如何命名路由链接?

mysql - 迭代数据集以更新 mysql 中的列

ruby-on-rails - 为什么 Rails 中不存在删除/销毁的直接路径?

Ruby:在 block 中使用 self?

javascript - Laravel 验证在处理时间表时似乎不起作用

javascript - 每个元素一次的 Jquery 触发函数

ruby-on-rails - 使用 secure_random stub rspec 中的随机值

ruby-on-rails - Rails CSRF 保护是如何工作的?