尝试使用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
吗? 我试图像这样添加一个postinstall
到packages.json
:
... "scripts": { "postinstall": "ln -s /app/vendor/node/bin/node /app/bin/node" } ...
但是这并没有帮助。 接下来,我将尝试挖掘我分叉的rubybuildpack,看看我是否可以修补path。 但是,这是一个非常缓慢的过程,往返于Heroku,所以如果别人知道什么是错的,我很想知道!
所以答案就是:
当Heroku像我们一样使用多buildpack构build时,所有的构build发生在/tmp
中的一个随机目录中,直到整个构build完成之前,没有任何东西放到像/app
这样的常规目录中。 解决我的问题是:
- 叉Herokurubybuildpack
- 删除旧的NodeJS 0.4.7二进制文件的构build,或者将一个已经删除的构build包卸载( mattwalters heroku-buildpack-ruby )
- 编辑.buildpack并确保你在Ruby buildpack上面有Heroku NodeJS buildpack
- 更新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
而一切都应该工作!