How do I specify local .gem files in my Gemfile?
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")
Related videos on Youtube
ddayan
Updated on December 02, 2020Comments
-
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?-
Ciro Santilli OurBigBook.com over 4 years
-
-
ddayan about 13 yearsTrue. 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 about 13 yearsyou can point to a local directory with gem "gemname", :path => "~/some/local/path"
-
ddayan about 13 yearsI think that :path requires the gem folder with gemspec file. I only have .gem files i wish to install.
-
ddayan about 13 yearsYes 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 about 13 yearsOk so cap deploy passed, but the gem wasn't installed "No such file to load -- vips" :/
-
bioneuralnet about 12 yearsThat'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 about 12 yearsWhat 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 over 11 yearsThanks! Also, I needed a third slash to do "file:///Absolute/Path/to/repo"
-
Anna over 11 years"bundle install" didn't work for me if the gem wasn't included in my existing Gemfile "source.
-
Anna over 11 yearsWouldn't it just be easier to run "gem server" on the command line and add source "localhost:8808" to your Gemfile
-
bert bruynooghe over 10 yearsJust 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 executebundle install --local
-
kode over 10 yearsAlso for some firewalls git protocol may be an issue. In such case try
gem "foreman", :git => "https://github.com/pje/foreman.git"
-
Leo Gallucci over 10 yearsThis 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 over 10 yearsBonus 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 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 usebundle package --all
if you want to include gems withpath
orgit
dependencies. It will give you a helpful reminder if it detects such dependencies, though. -
Nakilon about 8 yearsDoesn't work for me. Mac OS X. Bundler v1.11.2:
Could not fetch specs from file://Users/nakilon/....../
-
Asier about 8 years@Nakilon I had the same issue, but then realized I hadn't put my gem into the
gems
folder of therepo
folder, but only into therepo
folder. Have you created agems
folder? -
Robert Brown about 8 yearsThis 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 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 callrequire 'yourgame'
, it fails to include it. -
Samuel Garratt about 6 yearsThanks 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 andgem install --source localhost...
worked). -
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 about 5 yearsFYI: 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 yearsSuper trick! here is small addition for that. How to verify that gems are now available locally: gem list -r --clear-sources -s file:/repo