Project specific .gemrc files using the GEMRC environment variable

Recently I needed to add a new source entry to my .gemrc for a private RubyGems server. I commit my .gemrc to Git, so this was a problem. Not only because I don't want project specific changes cluttering up my .gemrc (I don't), but also because the URL of the source contains secrets that shouldn't be shared.

My default gemrc :sources: entry looked like this.

1
2
3
--- 
:sources: 
- https://rubygems.org

There doesn't seem to be a supported way to have per-project .gemrc files but you can override the file using the GEMRC environment variable. So if you can set a per-project GEMRC environment variable, you can have a per-project .gemrc.

I use direnv to set environment variables for my projects by creating a .envrc file in each of my project directories. So I can also use that here. I just add a line like this.

1
export GEMRC=path/to/project/specific/gemrc

And in that file I add the extra key to :sources:

1
2
3
4
--- 
:sources: 
- https://rubygems.org
- https://user:pass@custom.gem.server

I need to add the original https://rubygems.org source too because although the ~/.gemrc will still be read, the keys in the project specific file will replace any keys with the same name completely - they are not merged. You can see what values gem is using by running gem environment. Great for debugging.

I think using GEMRC for this purpose is a reasonable workaround for per-project .gemrc files.