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?
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.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
:With the following
.buildpacks
:And this
Aptfile
:My fork of
heroku-buildpack-apt
is required to export theBUNDLE_BUILD__CHARLOCK_HOLMES
variable via Heroku's ENV_DIRs. In the Gemfile you just referencegem '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 officialheroku-buildpack-ruby
by quite an amount, which is not acceptable to me.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):
heroku plugins:install https://github.com/heroku/heroku-buildpacks
heroku buildpacks:set frederick/heroku-buildpack-ruby -a myapp
gem 'charlock_holmes'
Try using
gem "charlock_holmes_bundle_icu", "~> 0.6.9.2"
. More info.