How do I specify local .gem files in my Gemfile?

116,776

Solution 1

This isn't strictly an answer to your question about installing .gem packages, but you can specify all kinds of locations on a gem-by-gem basis by editing your Gemfile.

Specifying a :path attribute will install the gem from that path on your local machine.

gem "foreman", path: "/Users/pje/my_foreman_fork"

Alternately, specifying a :git attribute will install the gem from a remote git repository.

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

(As @JHurrah mentioned in his comment.)

Solution 2

Seems bundler can't use .gem files out of the box. Pointing the :path to a directory containing .gem files doesn't work. Some people suggested to setup a local gem server (geminabox, stickler) for that purpose.

However, what I found to be much simpler is to use a local gem "server" from file system: Just put your .gem files in a local directory, then use "gem generate_index" to make it a Gem repository

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

Finally point bundler to this location by adding the following line to your Gemfile

source "file://path/to/repo"

If you update the gems in the repository, make sure to regenerate the index.

Solution 3

I would unpack your gem in the application vendor folder

gem unpack your.gem --target /path_to_app/vendor/gems/

Then add the path on the Gemfile to link unpacked gem.

gem 'your', '2.0.1', :path => 'vendor/gems/your'

Solution 4

By default Bundler will check your system first and if it can't find a gem it will use the sources specified in your Gemfile.

Solution 5

You can force bundler to use the gems you deploy using "bundle package" and "bundle install --local"

On your development machine:

bundle install

(Installs required gems and makes Gemfile.lock)

bundle package

(Caches the gems in vendor/cache)

On the server:

bundle install --local

(--local means "use the gems from vendor/cache")

Share:
116,776

Related videos on Youtube

ddayan
Author by

ddayan

Updated on December 02, 2020

Comments

  • ddayan
    ddayan over 3 years

    I have a couple of gem files which I install via gem install xx.gem. Can I tell Bundler to use them? Or do I have to specify the source path?

  • ddayan
    ddayan about 13 years
    True. but what if I haven't installed it before?(when im deploying to a server) Could not find Imlib2-Ruby-0.5.2 in any of the sources command finished
  • JHurrah
    JHurrah about 13 years
    you can point to a local directory with gem "gemname", :path => "~/some/local/path"
  • ddayan
    ddayan about 13 years
    I think that :path requires the gem folder with gemspec file. I only have .gem files i wish to install.
  • ddayan
    ddayan about 13 years
    Yes looks like I needed to specify the version, I wonder why it always told me what version it was looking for. for an example "Could not find ruby-vips-0.1.0 in any of the sources" now I specified gem 'ruby-vips' '=0.1.0', :path =>.... and it works. Thanks.
  • ddayan
    ddayan about 13 years
    Ok so cap deploy passed, but the gem wasn't installed "No such file to load -- vips" :/
  • bioneuralnet
    bioneuralnet about 12 years
    That's definitely not true, at least any longer. Bundler does not look at your system gems, and only goes by what's in the Gemfile. One of reasons it's so terrible.
  • Aditya Sinha
    Aditya Sinha about 12 years
    What if I can't install anything on the server? In this case, I need to build with rake but server doesn't have a gem I use for building; but I have no problem checking in the dependencies.
  • Anna
    Anna over 11 years
    Thanks! Also, I needed a third slash to do "file:///Absolute/Path/to/repo"
  • Anna
    Anna over 11 years
    "bundle install" didn't work for me if the gem wasn't included in my existing Gemfile "source.
  • Anna
    Anna over 11 years
    Wouldn't it just be easier to run "gem server" on the command line and add source "localhost:8808" to your Gemfile
  • bert bruynooghe
    bert bruynooghe over 10 years
    Just remove the gem file temporarily form the gem file before doing bundle install After that, copy the gemfile to vendor/cache, add the gem back to the gemfile and execute bundle install --local
  • kode
    kode over 10 years
    Also for some firewalls git protocol may be an issue. In such case try gem "foreman", :git => "https://github.com/pje/foreman.git"
  • Leo Gallucci
    Leo Gallucci over 10 years
    This is really cool Martin! Thanks for sharing, is exactly was i was looking for since i didn't want to depend on running a gem server nor i wanted to host the entire project, just the .gem file.
  • Leo Gallucci
    Leo Gallucci over 10 years
    Bonus tip: You can get around the absolute path requirement by using File.expand_path like this source "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
  • L2G
    L2G almost 10 years
    bundle package is a great suggestion, even now, three years later. If your version of Bundler is older than 2.0 (not yet released at this writing), you will need to use bundle package --all if you want to include gems with path or git dependencies. It will give you a helpful reminder if it detects such dependencies, though.
  • Nakilon
    Nakilon about 8 years
    Doesn't work for me. Mac OS X. Bundler v1.11.2: Could not fetch specs from file://Users/nakilon/....../
  • Asier
    Asier about 8 years
    @Nakilon I had the same issue, but then realized I hadn't put my gem into the gems folder of the repo folder, but only into the repo folder. Have you created a gems folder?
  • Robert Brown
    Robert Brown about 8 years
    This is a great solution for me as I work behind a corporate firewall that gem cannot penetrate. So I download gem files manually from rubygems.org and build my own repo.
  • garbagecollector
    garbagecollector over 7 years
    @ddayan, any solution to your "No such file to load" issue? I am running into the same one myself. bundle install works fine and dandy, but once you call require 'yourgame', it fails to include it.
  • Samuel Garratt
    Samuel Garratt about 6 years
    Thanks a lot. This worked for me since gem server was returning 404s when bundler was trying to install gems (even though I could see the repo page in localhost and gem install --source localhost... worked).
  • jmoney
    jmoney about 5 years
    > That's definitely not true, at least any longer. Bundler does not look at your system gems, and only goes by what's in the Gemfile. One of reasons it's so terrible. Agreed. This answer isn't correct (anymore? maybe it was once).
  • Liam Dawson
    Liam Dawson about 5 years
    FYI: this may not work as well as you'd hope if you develop on a different platform than you deploy to (e.g. develop on macOS, deploy to Linux). As per the --local docs: "Note that if a appropriate platform-specific gem exists on rubygems.org it will not be found."
  • Алексей Лещук
    Алексей Лещук over 4 years
    Super trick! here is small addition for that. How to verify that gems are now available locally: gem list -r --clear-sources -s file:/repo