Question

I'm using the ruby gem charlock_holmes in a Rails 4 app to detect the character encodings of CSV's that I'm parsing so that CSV.foreach doesn't throw an error.

However, when I try to push to heroku (with gem 'charlock_holmes' in the Gemfile) I get the following error:

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.

How do I get libicu-dev to install on Heroku?

Was it helpful?

Solution 3

Sadly the other two solutions don't work for me (see below), so I had to come up with my own solution. This solution works with Ruby 1.9.3 but hammady says it does not work with 2.0.0.

I used heroku-buildpack-multi:

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

With the following .buildpacks:

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

And this Aptfile:

libicu-dev

My fork of heroku-buildpack-apt is required to export the BUNDLE_BUILD__CHARLOCK_HOLMES variable via Heroku's ENV_DIRs. In the Gemfile you just reference gem 'charlock_holmes' as usual and all works smoothly now for me.

If anyone can think of a way that doesn't involve exporting BUNDLE_BUILD__CHARLOCK_HOLMES then please let me know!


Ryan's answer doesn't work for me - Heroku bails because the bundle install step doesn't offer any output for 3 minutes. Silasj's answer references the frederick/heroku-buildpack-ruby buildpack which is no longer maintained and lags behind the official heroku-buildpack-ruby by quite an amount, which is not acceptable to me.

OTHER TIPS

Try using gem "charlock_holmes_bundle_icu", "~> 0.6.9.2". More info.

EDIT June 2017: As custom one-off buildpacks for this singular issue seem to go out of date, I'd recommend trying the approach presented by Benjie in this answer. Use heroku-buildpack-multi and heroku-buildpack-apt with an Aptfile to specify dependencies.

Steve Tooke also has an excellent write-up on this very issue: http://tooky.co.uk/using-charklock_holmes-on-heroku/ -- note that things may have changed in the 3 years since this question was asked, but the thing to remember is that generic/supported, rather than specific/unsupported, is the best route to go with buildpacks.

Original Answer:

While Ryan's answer works, it also slows down deploy times to -in my tests- up to 15 minutes. I even ran into Heroku's deploy time limit a few times.

An easier solution (that doesn't affect deploy times), is to use a Heroku buildpack

Aaron Severs created a buildpack that includes icu4c (which charlock_holmes relies on) in the dyno build. [see here]

Steps to make it work (Copied from Aaron's comment for posterity):

  1. Install the buildpack CLI: heroku plugins:install https://github.com/heroku/heroku-buildpacks
  2. Set the buildpack to Aaron's fork heroku buildpacks:set frederick/heroku-buildpack-ruby -a myapp
  3. In your Gemfile, use: gem 'charlock_holmes'

This works:

Execute the following commands and install this:

1. brew install erlang icu4c spidermonkey

2. brew ln icu4c

This will install the required dependencies and then try to install charlock_homes.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top