如何在Heroku上安装charlock_holmes依赖libicu-dev

sil*_*son 6 heroku icu ruby-on-rails-4

我在Rails 4应用程序中使用ruby gem charlock_holmes来检测我正在解析的CSV的字符编码,这样CSV.foreach就不会抛出错误.

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

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.
Run Code Online (Sandbox Code Playgroud)

如何libicu-dev在Heroku上安装?

Rya*_*ton 13

尝试使用gem "charlock_holmes_bundle_icu", "~> 0.6.9.2".更多信息.

  • 谢谢,瑞恩.我会试一试,看看它是怎么回事. (2认同)

sil*_*son 11

编辑2017年6月:由于这个单一问题的定制一次性构建包似乎已经过时,我建议尝试Benjie在这个答案中提出的方法.使用Heroku的-buildpack的多和Heroku的-buildpack,容易Aptfile指定依赖.

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

原答案:

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

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

Aaron Severs在dyno charlock_holmes构建中创建了一个包含icu4c(依赖于)的buildpack .[看这里]

使它成功的步骤(复制自亚伦对子孙后代的评论):

  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'


Ben*_*jie 2

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

我用了heroku-buildpack-multi

heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
Run Code Online (Sandbox Code Playgroud)

具有以下内容.buildpacks

https://github.com/benjie/heroku-buildpack-apt
https://github.com/heroku/heroku-buildpack-ruby
Run Code Online (Sandbox Code Playgroud)

和这个Aptfile

libicu-dev
Run Code Online (Sandbox Code Playgroud)

我的forkheroku-buildpack-apt需要BUNDLE_BUILD__CHARLOCK_HOLMES通过Heroku 的 ENV_DIRs导出变量。在 Gemfile 中,您只需gem 'charlock_holmes'像往常一样引用,现在对我来说一切都很顺利。

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


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