目次
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