ChatGPT解决这个技术问题 Extra ChatGPT

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

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?


D
David Hempy

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.)


Also for some firewalls git protocol may be an issue. In such case try gem "foreman", :git => "https://github.com/pje/foreman.git"
M
Martin Thiede

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.


Thanks! Also, I needed a third slash to do "file:///Absolute/Path/to/repo"
Wouldn't it just be easier to run "gem server" on the command line and add source "localhost:8808" to your Gemfile
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"
@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?
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
S
Satishakumar Awati

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'

J
JHurrah

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.


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
you can point to a local directory with gem "gemname", :path => "~/some/local/path"
I think that :path requires the gem folder with gemspec file. I only have .gem files i wish to install.
Ok so cap deploy passed, but the gem wasn't installed "No such file to load -- vips" :/
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.
H
Henry Collingridge

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")


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.
"bundle install" didn't work for me if the gem wasn't included in my existing Gemfile "source.
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
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.
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."
V
Victor Moroz

Adding .gem to vendor/cache seems to work. No options required in Gemfile.


D
Dave Sag

I found it easiest to run my own gem server using geminabox

See these simple instructions.