我正在开发一个 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
直到整个构建完成。我的问题的解决方案是:
- 叉Heroku Ruby buildpack
- 删除旧 NodeJS 0.4.7 二进制文件中的构建,或者 fork 一个已经删除它的构建包 (mattwalters heroku-buildpack-ruby)
- 编辑 .buildpacks 并确保您在 Ruby buildpack 之上拥有 Heroku NodeJS buildpack
- 更新 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/