尝试使用browserify-rails时失败的资产编译

我正在开发一个Ruby on Rails 4.x项目,我想使用browserify-rails gem,这样我就可以在一些JavaScript文件中使用CommonJS了。 在开发过程中,这在本地非常有效,但是在Heroku上资产汇编失败。 第一个问题是Heroku Ruby buildpack将节点0.4.7添加到/app/bin ,并且首先在PATH环境variables中。 这打破了浏览。 我改变了一个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资源时发生错误(因此触发了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' ... 

所以看起来在Ruby on Rails构build步骤中,节点二进制文件是不可访问的。 这是因为节点位于Ruby buildpack的PATH设置不包含/app/vendor/node/bin/node吗? 我试图像这样添加一个postinstallpackages.json

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

但是这并没有帮助。 接下来,我将尝试挖掘我分叉的rubybuildpack,看看我是否可以修补path。 但是,这是一个非常缓慢的过程,往返于Heroku,所以如果别人知道什么是错的,我很想知道!

所以答案就是:

当Heroku像我们一样使用多buildpack构build时,所有的构build发生在/tmp中的一个随机目录中,直到整个构build完成之前,没有任何东西放到像/app这样的常规目录中。 解决我的问题是:

  1. 叉Herokurubybuildpack
  2. 删除旧的NodeJS 0.4.7二进制文件的构build,或者将一个已经删除的构build包卸载( mattwalters heroku-buildpack-ruby )
  3. 编辑.buildpack并确保你在Ruby buildpack上面有Heroku NodeJS buildpack
  4. 更新heroku-buildpack-ruby,以便在slug编译期间使用PATH来包含Heroku NodeJS buildpack在/tmp创build的NodeJS目录

为了使事情更容易,我已经分叉mattwalters Heroku的Ruby buildpack,并添加了代码来更新path: https : //github.com/cymen/heroku-buildpack-ruby

最终的结果是,当在编译过程中发生资产调用时,PATH现在有一个最近的NodeJS二进制文件,所以browserify-rails工作正常! 请注意,browserify-rails仍然相当粗糙,所以你可能需要对其进行自定义的调整,使事情正常工作( 我有一个叉,排除供应商和茉莉花从模块化 )。

另一种方法是使用Heroku Ruby buildpack库存,但按照“Hacking”中的指导使用您自己的NodeJS版本: Hacking

Heroku最新的Ruby buildpack( v113+ )使用了Node.js buildpack的node二进制文件,所以你只需要设置多个buildpack就可以访问最新的Ruby和Node.js buildpack。

这是我的.buildpacks文件: https://github.com/heroku/heroku-buildpack-nodejs#v63 https://github.com/heroku/heroku-buildpack-ruby#v129 : https://github.com/heroku/heroku-buildpack-nodejs#v63 https://github.com/heroku/heroku-buildpack-ruby#v129

而一切都应该工作!