Javascript 尝试使用browserify rails时资产编译失败
我正在从事一个RubyonRails4.x项目,我想使用Javascript 尝试使用browserify rails时资产编译失败,javascript,ruby-on-rails,ruby,node.js,heroku,Javascript,Ruby On Rails,Ruby,Node.js,Heroku,我正在从事一个RubyonRails4.x项目,我想使用browserifyRailsgem,以便在一些JavaScript文件中使用CommonJS。在开发过程中,这在本地非常有效,但是在Heroku上,资产编译失败了。第一个问题是Heroku Ruby buildpack在/app/bin中添加了节点0.4.7,这是路径环境变量中的第一个问题。这破坏了browserify。我改成了一个Ruby buildpack,但没有这样做,所以现在我的.buildpack文件如下所示: https://
browserifyRails
gem,以便在一些JavaScript文件中使用CommonJS。在开发过程中,这在本地非常有效,但是在Heroku上,资产编译失败了。第一个问题是Heroku Ruby buildpack在/app/bin
中添加了节点0.4.7,这是路径
环境变量中的第一个问题。这破坏了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
尝试编译使用CommonJSrequire
的JavaScript资产时出错(因此触发browserify rails
):
因此,在RubyonRails构建步骤中,似乎无法访问节点二进制文件。这是因为节点位于Ruby buildpack的路径设置不包括/app/vendor/node/bin/node
的位置吗?我尝试将postinstall
添加到packages.json
中,如下所示:
...
"scripts": {
"postinstall": "ln -s /app/vendor/node/bin/node /app/bin/node"
}
...
但那没用。接下来,我将尝试挖掘我分叉的ruby构建包,看看是否可以修改路径。但这是一个非常缓慢的过程,需要往返时间才能部署到Heroku,所以如果其他人知道问题出在哪里,我很想知道 所以答案是:
当Heroku像我们一样使用多构建包构建时,所有构建都发生在/tmp
中的随机目录中,并且在整个构建完成之前,不会将任何内容放入常规目录中,如/app
。我的问题的解决方案是:
叉
删除旧NodeJS 0.4.7二进制文件中的内部版本,或者使用已删除的构建包()
编辑.buildpacks并确保在Ruby构建包之上有Heroku NodeJS构建包
更新heroku buildpack ruby,以便它在slug编译期间使用更新路径,以包括heroku NodeJS buildpack在/tmp
中创建的NodeJS目录
为了让事情变得更简单,我已经分叉了mattworts
Heroku Ruby buildpack,并添加了更新路径的代码:
最终结果是,当在slug编译过程中发生资产兼容时,路径中现在有一个最新的NodeJS二进制文件,这样browserify rails就可以工作了!请注意,BrowserifyRails仍然相当粗糙,因此您可能需要对其进行自定义调整,以使其正常工作()
另一种方法是使用stock Heroku Ruby buildpack,但遵循“黑客”下的指南使用自己版本的NodeJS:Heroku最新的Ruby buildpack(v113+
)使用Node.js buildpack的节点
二进制文件,因此,您只需要设置多个BuildPack,以访问最新的Ruby和Node.js BuildPack
这是我的.buildpacks
文件:
https://github.com/heroku/heroku-buildpack-nodejs#v63
https://github.com/heroku/heroku-buildpack-ruby#v129
一切都会好起来的
...
"scripts": {
"postinstall": "ln -s /app/vendor/node/bin/node /app/bin/node"
}
...