【问题标题】:How to install charlock_holmes dependency libicu-dev on Heroku如何在 Heroku 上安装 charlock_holmes 依赖 libicu-dev
【发布时间】:2013-09-26 10:05:35
【问题描述】:

我在 Rails 4 应用程序中使用 ruby​​ gem charlock_holmes 来检测我正在解析的 CSV 的字符编码,以便 CSV.foreach 不会引发错误。

但是,当我尝试推送到 heroku(在 Gemfile 中使用 gem 'charlock_holmes')时,我收到以下错误:

Installing charlock_holmes (0.6.9.4)
   Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

   /tmp/build_e741f6ed-a860-47bf-8c0d-1b678fa0ebeb/vendor/ruby-2.0.0/bin/ruby extconf.rb
   checking for main() in -licui18n... no
   checking for main() in -licui18n... no


   ***************************************************************************************
   *********** icu required (brew install icu4c or apt-get install libicu-dev) ***********
   ***************************************************************************************
   *** extconf.rb failed ***
   Could not create Makefile due to some reason, probably lack of necessary
   libraries and/or headers.  Check the mkmf.log file for more details.  You may
   need configuration options.

   Provided configuration options:
   --with-opt-dir
   --without-opt-dir
   --with-opt-include
   --without-opt-include=${opt-dir}/include
   --with-opt-lib
   --without-opt-lib=${opt-dir}/lib
   --with-make-prog
   --without-make-prog
   --srcdir=.
   --curdir
   --ruby=/tmp/build_e741f6ed-a860-47bf-8c0d-1b678fa0ebeb/vendor/ruby-2.0.0/bin/ruby
   --with-icu-dir
   --without-icu-dir
   --with-icu-include
   --without-icu-include=${icu-dir}/include
   --with-icu-lib
   --without-icu-lib=${icu-dir}/
   --with-icui18nlib
   --without-icui18nlib
   --with-icui18nlib
   --without-icui18nlib


   Gem files will remain installed in /tmp/build_e741f6ed-a860-47bf-8c0d-1b678fa0ebeb/vendor/bundle/ruby/2.0.0/gems/charlock_holmes-0.6.9.4 for inspection.
   Results logged to /tmp/build_e741f6ed-a860-47bf-8c0d-1b678fa0ebeb/vendor/bundle/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/gem_make.out
   An error occurred while installing charlock_holmes (0.6.9.4), and Bundler cannot
   continue.
   Make sure that `gem install charlock_holmes -v '0.6.9.4'` succeeds before
   bundling.

如何让libicu-dev 安装到 Heroku?

【问题讨论】:

    标签: heroku ruby-on-rails-4 icu


    【解决方案1】:

    尝试使用gem "charlock_holmes_bundle_icu", "~> 0.6.9.2"More info.

    【讨论】:

    • 谢谢,瑞恩。我会试试这个,看看效果如何。
    • 那行得通。不过,我没有指定版本,因为我在 Rails 引擎中使用它。
    • 为我工作!仅供参考 - 使用此解决方案后,我必须在我使用 Charlock holmes 的任何文件的顶部包含 require 'charlock_holmes'
    【解决方案2】:

    2017 年 6 月编辑:由于针对这个单一问题的自定义一次性构建包似乎已经过时,我建议尝试 Benjie 在this answer 中提出的方法。使用 heroku-buildpack-multi 和 heroku-buildpack-aptAptfile 来指定依赖项。

    Steve Tooke 在这个问题上也有一篇出色的文章:http://tooky.co.uk/using-charklock_holmes-on-heroku/ -- 请注意,自提出这个问题以来的 3 年内情况可能发生了变化,但要记住的是通用/支持,而不是比特定/不受支持,是使用 buildpacks 的最佳途径。

    原答案:

    虽然Ryan's 答案有效,但它也会将部署时间减慢到 - 在我的测试中 - 最多 15 分钟。我什至几次遇到 Heroku 的部署时间限制。

    一个更简单的解决方案(不影响部署时间)是使用 Heroku buildpack

    Aaron Severs 在 dyno 构建中创建了一个包含 icu4c(charlock_holmes 依赖)的构建包。 [see here]

    使其发挥作用的步骤(复制自 Aaron 的后人评论):

    1. 安装 buildpack CLI: heroku plugins:install https://github.com/heroku/heroku-buildpacks
    2. 将 buildpack 设置为 Aaron 的 fork heroku buildpacks:set frederick/heroku-buildpack-ruby -a myapp
    3. 在您的 Gemfile 中,使用:gem 'charlock_holmes'

    【讨论】:

    • 这仍然是一个有效的答案,虽然 Benjie 说 frederick/heroku-buildpack-ruby 没有维护,但它最近已更新并且似乎在不断更新 - 至少在我上次检查 README.md 时是这样。
    • 我在执行这些步骤时收到remote: ! Push rejected, error fetching custom buildpack。我错过了什么吗?
    【解决方案3】:

    遗憾的是,其他两个解决方案对我不起作用(见下文),所以我不得不提出自己的解决方案。此解决方案适用于 Ruby 1.9.3,但 hammady 表示它不适用于 2.0.0。

    我用heroku-buildpack-multi:

    heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
    

    以下.buildpacks

    https://github.com/benjie/heroku-buildpack-apt
    https://github.com/heroku/heroku-buildpack-ruby
    

    还有这个Aptfile

    libicu-dev
    

    heroku-buildpack-apt 中的My fork 需要通过Heroku's ENV_DIRs 导出BUNDLE_BUILD__CHARLOCK_HOLMES 变量。在 Gemfile 中,您只需像往常一样引用gem 'charlock_holmes',现在对我来说一切正常。

    如果有人能想到不涉及导出 BUNDLE_BUILD__CHARLOCK_HOLMES 的方法,请告诉我!


    Ryan's 答案对我不起作用 - Heroku 放弃,因为捆绑安装步骤在 3 分钟内没有提供任何输出。 Silasj's 的答案引用了 frederick/heroku-buildpack-ruby buildpack,它不再维护,并且落后于官方 heroku-buildpack-ruby 相当多,这对我来说是不可接受的。

    【讨论】:

    • 我很幸运在发布后 18 小时后才找到您的答案!我现在正在推动,看看它是否有效:)
    • 它对我不起作用。这是 git push 的输出:pastebin.com/W7izp3fD,我还尝试了 github.com/ddollar/heroku-buildpack-apt 中所述的 heroku build,但由于只读文件系统失败,此处输出:pastebin.com/TwFtwmvG。奇怪的是我可以看到 libicu 已安装,但 bundler 仍然无法构建原生扩展。
    • @hammady 我很想知道你是否知道出了什么问题;它现在对我有用了一些推动,但我昨天花了 4 个多小时迭代以达到这一点。我认为您的 heroku build 命令失败是因为新的 ENV_DIR 东西 - 编译脚本似乎没有发送 $3 所以它试图写入 /LIBRARY_PATH 而不是 /path/to/ENV_DIR/LIBRARY_PATH
    • @hammady 我刚刚推出了一个新版本的 heroku-buildpack-apt,它将更多变量导出到 ENV_DIR 并修复了一个我没有意识到我与运行 @987654347 相关的问题@在推送期间。除此之外,我不知所措;虽然你在使用 Ruby 2 而我在 1.9.3。
    • 感谢您的解决方案为我提供了完成这项工作所需的一切 - 我稍微改变了流程,将特定的 .bundle/config 用于 heroku 和第三个构建包。详情在这里:tooky.co.uk/using-charklock_holmes-on-heroku
    【解决方案4】:

    这行得通:

    执行以下命令并安装:

    1. brew install erlang icu4c spidermonkey

    2。酿造ln icu4c

    这将安装所需的依赖项,然后尝试安装 charlock_homes。

    【讨论】:

    • OP 能够在本地安装,但在 Heroku 上安装时遇到困难。这个答案没有解决 OP 的问题(这就是它被否决的原因)。
    猜你喜欢
    • 2012-10-14
    • 2015-10-31
    • 2016-01-20
    • 2013-07-19
    • 2012-10-28
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2016-12-01
    相关资源
    最近更新 更多