GemfileでRails.envを使う方法

created
updated

GemfileでRails.envを利用したかったので、その方法を調べました。

経緯

Gemfile内で、productionのみGitHubからソースをロードしたい

開発環境(:development, :test)では、GitHubの別リポジトリのアプリケーション(Rails Engine)を参照しており、本番環境(:production)ではgit cloneして配置するようにしていました。開発環境では毎回コメントアウトをしていて煩わしかったので、GemfileでRails.envを使うことができないか調査しました。

group :production ... end では、ロードはされないがダウンロードはされる

group :productionで、Railsの起動モードで利用するGemを選択することはできますが、ダウンロードはされてしまいます。そのため、ダウンロードもしたくない場合は、実行されないようにする必要があります。

結論

RailsのGemfile内ではRails.envは使えない

Gemfile内では、Rails.envは利用できません。利用した場合は

Gemfile

source 'https://rubygems.org'

...

# production の時はGitHubから参照
if Rails.env.production?
  group :production do
    # YOUR CODE
  end
end
There was an error parsing `Gemfile`: uninitialized constant #<Class:#<Bundler::Plugin::DSL:0x0000xxxxxxxxxxxx>>::Rails. Bundler cannot continue.

というエラーが発生します。

Gemfile内では環境変数のENVが使える

GemfileではENV['{ENV_NAME}']で、環境変数を取得することができます。これを利用することで、Gemfile内のif文で条件分岐をすることが可能です。

Gemfile

source 'https://rubygems.org'

...

# production の時はGitHubから参照
if ENV['RAILS_ENV'] == :production
  group :production do
    # YOUR CODE
    gem 'sample_engine', git: 'https://github.com/{YOUR_REPOSITORY}/sample_engine.git'
    gem 'hoge_engine', git: 'https://github.com/{YOUR_REPOSITORY}/hoge_engine.git'
    gem 'foo_engine', git: 'https://github.com/{YOUR_REPOSITORY}/foo_engine.git'
  end
end

config/application.rb

require_relative 'boot'
require 'rails/all'

...

# development, test の時はディレクトリから参照
unless Rails.env.production?
  require_relative '../engines/sample/lib/sample_engine'
  require_relative '../engines/hoge/lib/hoge_engine'
  require_relative '../engines/foo/lib/foo_engine'
end
TOP