【问题标题】:Failed asset compilation when attempting to use browserify-rails尝试使用 browserify-rails 时资产编译失败
【发布时间】:2014-05-17 09:46:02
【问题描述】:

我正在开发一个 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"
}
...

但这并没有帮助。接下来,我将尝试深入研究我 fork 的 ruby​​ buildpack,看看我是否可以修改路径。但这是一个非常缓慢的过程,需要往返时间来部署到 Heroku,所以如果其他人知道出了什么问题,我很想知道!

【问题讨论】:

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


    【解决方案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 目录

    为了让事情变得更简单,我分叉了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,但按照“黑客”下的指南使用您自己的 NodeJS 版本:Hacking

    【讨论】:

      【解决方案2】:

      Heroku 最新的 Ruby 构建包 (v113+) 使用 Node.js 构建包的 node 二进制文件,因此您只需设置多个构建包即可访问最新的 Ruby 和 Node.js 构建包。

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

      一切都应该正常工作!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        • 2021-11-12
        • 2014-06-27
        相关资源
        最近更新 更多