ChatGPT解决这个技术问题 Extra ChatGPT

How can I specify a local gem in my Gemfile?

I'd like Bundler to load a local gem. Is there an option for that? Or do I have to move the gem folder into the .bundle directory?


I
Iulian Onofrei

I believe you can do this:

gem "foo", path: "/path/to/foo"

A hard-coded path is fine for a quick hack session, but bloudermilk's local gem solution is more effective for projects under version control. It lets you keep checking in both projects - gem and project using the gem - such that others can don't have to check out the gem source or share the same paths.
You can make this slightly cleaner by using a .gitignored symlink to your local gem in your project directory -- that way you can use source control on both projects separately and others can do the same without having an identical directory structure.
Something to watch out for might be Spring. If you are using a local path for your gem you could notice cached versions of your local gem like I did in rails console. If it doesn't seem like your local gem changes are being picked up try spring stop to see if it is indeed the issue.
Way better way of doing it this here: rossta.net/blog/…
This is a perfectly fine way of doing it if you are testing local development of a gem on a larger project. In this case, this is the "better" way to do it then having to push to a repository to test local changes.
s
sibo

In addition to specifying the path (as Jimmy mentioned) you can also force Bundler to use a local gem for your environment only by using the following configuration option:

$ bundle config local.GEM_NAME /path/to/local/git/repository

This is extremely helpful if you're developing two gems or a gem and a rails app side-by-side.

Note though, that this only works when you're already using git for your dependency, for example:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

As seen on the docs.


I am having issues with this because I am using BUNDLE_PATH (building a package for distribution). When doing what you suggested, or Jimmy's answer, it only does a using, and not actually installing to my BUNDLE_PATH folder. I was not able to figure this out, any help?
Note this won't work with a gemspec, per discussion here.
To disable the local override: bundle config --delete local.GEM_NAME
I had to remove version directive from the gem line to get this to work.
If you would like to use a different branch in development from production, you also have to set bundle config disable_local_branch_check true or Bundler will complain about the branch. Be careful with this though, as the checks are supposed to stop incorrect commits getting into Gemfile.lock. Docs here: bundler.io/v1.12/git.html
R
Rimian

You can also reference a local gem with git if you happen to be working on it.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Then, if it changes I run

bundle exec gem uninstall foo
bundle update foo

But I am not sure everyone needs to run these two steps.


this is great, but is not that convenient if you're actively developing the gem... because you'll need to commit every change & bundle uninstall <gem> && bundle install , for every change you want reflected on your app
M
Michael Mior

In order to use local gem repository in a Rails project, follow the steps below:

Check if your gem folder is a git repository (the command is executed in the gem folder) git rev-parse --is-inside-work-tree Getting repository path (the command is executed in the gem folder) git rev-parse --show-toplevel Setting up a local override for the rails application bundle config local.GEM_NAME /path/to/local/git/repository where GEM_NAME is the name of your gem and /path/to/local/git/repository is the output of the command in point 2 In your application Gemfile add the following line: gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master' Running bundle install should give something like this: Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) where GEM_NAME is the name of your gem and /path/to/local/git/repository from point 2 Finally, run bundle list, not gem list and you should see something like this: GEM_NAME (0.0.1 5a68b88) where GEM_NAME is the name of your gem

A few important cases I am observing using:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3

It seems RubyMine is not showing local gems as an external library. More information about the bug can be found here and here

When I am changing something in the local gem, in order to be loaded in the rails application I should stop/start the rails server

If I am changing the version of the gem, stopping/starting the Rails server gives me an error. In order to fix it, I am specifying the gem version in the rails application Gemfile like this: gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'


N
Nesha Zoric

You can reference gems with source:

source: 'https://source.com', git repository (:github => 'git/url') and with local path

:path => '.../path/gem_name'.

You can learn more about [Gemfiles and how to use them] (https://kolosek.com/rails-bundle-install-and-gemfile) in this article.


C
C Johnson

If you want the branch too:

gem 'foo', path: "point/to/your/path", branch: "branch-name"

This doesn't work, generates an error: Only gems with a git source can specify a branch.