Git gems
We can install Gems from any git repo with:
# gems.rb
gem "gem_name",
git: "https://git-server.com/user/repo.git",
branch: "5-stable",
ref: "4aded",
tag: "v5.0.0"
If we only specify the git repo, ref will default to HEAD, and branch to master.
For security reasons it’s better not to use http, nor git as protocols. Same goes for bundler’s built-in git sources, at least for versions <= 1.16.
When we need several gems from the same source we can DRY our gems.rb file with
git_source(:not_a_bug){ |repo_details| "https://notabug.org/#{repo_details}.git" }
gem "some_gem", :not_a_bug => "user/repo"
gem "another_gem", :not_a_bug => "team/repo"
We can even use blocks to group different gems from a single repo:
not_a_bug "user/repo", branch: "master" do
gem "gem_name-plugin"
gem "gem_name-extension"
end
If we need to work with the local git repo of a gem
$ bundle config local.gem_name /path/to/local/git/repo.git
which overrides the gems.rb file behaviour. Specifically,
gem "gem_name", :git => "https://git.com/user/repo.git", :branch => "fix-or-feature"
Since new commits in the local git repo update the revision in the gems.locked file, bundler requires a branch.
To reset gems.rb behaviour back to normal,
$ bundle config --delete local.gem_name
Whilst possible to save git-server’s credentials using bundle config
$ bundle config --global https://git.com user:password
$ bundle config --local https://git.com/project/repo.git user:password
Is better to do so through an env var
$ export BUNDLE_NOTABUG__ORG=user:password
Notice how any periods in the configuration keys must be replaced with two underscores when setting it via environment variables. The configuration key local.rack becomes the environment variable BUNDLE_LOCAL__RACK.
For private repos in hosts where we can use personal OAuth tokens we can
$ export BUNDLE_GIT__COM=abcd0123generatedtoken:x-oauth-basic