我正在开发一个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的往返时间,所以如果其他人知道什么是错的,我很想知道!
答案 0 :(得分:1)
所以答案结果是:
当Heroku像我们一样使用多构建包构建时,所有构建都发生在/tmp
中的随机目录中,并且没有任何内容放入常规目录,如/app
,直到整个构建完成。我的问题的解决方案是:
/tmp
中创建的NodeJS目录为了简化操作,我分叉了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
一切都应该有效!