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

时间:2014-04-04 21:49:24

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

我正在开发一个Ruby on Rails 4.x项目,我想使用browserify-rails gem,以便我可以在我的一些JavaScript文件中使用CommonJS。这在开发过程中在本地运行良好,但资源编译在Heroku上失败。第一个问题是Heroku Ruby buildpack将节点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资源时出错(因此触发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构建步骤中似乎无法访问节点二进制文件。这是因为节点位于Ruby buildpack的PATH设置不包含/app/vendor/node/bin/node的位置吗?我尝试将postinstall添加到packages.json,如下所示:

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

但这没有帮助。接下来我将尝试深入挖掘我分叉的ruby buildpack,看看我是否可以修补路径。但这是一个非常缓慢的过程,需要往返Heroku的往返时间,所以如果其他人知道什么是错的,我很想知道!

2 个答案:

答案 0 :(得分:1)

所以答案结果是:

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

  1. 分叉Heroku Ruby buildpack
  2. 删除旧NodeJS 0.4.7二进制文件中的构建版本,或者代之以删除已删除它的构建包(mattwalters heroku-buildpack-ruby
  3. 编辑.buildpacks并确保在Ruby buildpack上面有Heroku NodeJS buildpack
  4. 更新heroku-buildpack-ruby,以便在slug编译期间使用它来更新PATH,以包含由Heroku NodeJS buildpack在/tmp中创建的NodeJS目录
  5. 为了简化操作,我分叉了mattwalters Heroku Ruby buildpack并添加了更新路径的代码:https://github.com/cymen/heroku-buildpack-ruby

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

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

答案 1 :(得分:1)

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

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

一切都应该有效!