質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

8847閲覧

.env に、RAILS_ENV=production と書いたのに、rails db:migrate が development 環境で動く

ya-mon

総合スコア22

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/05/20 02:18

編集2019/05/20 05:35

現象

・表題の通りです

現状認識

・.env に、RAILS_ENV=production と書けば、rails コマンドに環境を明示しなくても、production 環境で動く
・環境変数 RAILS_ENV=production と設定しておけば、rails コマンドで、環境名を明示しなくても、環境変数の環境で動く

わからない点

・.env の環境変数はいつ読み込まれるのか

追記[わからない点2]

・rails コマンドは、.env の環境変数 RAILS_ENV に関係なく、デフォルトで development で動くものなのでしょうか?

根本の理解不足・認識違いがある気がしますが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

dotenv (dotenv-rails) を導入していますか?
https://github.com/bkeepers/dotenv

投稿2019/05/20 02:29

編集2019/05/20 02:30
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ya-mon

2019/05/20 02:46

Gemfile に記載して、bundle install しました。 gem list で以下の2つが出てきます。 dotenv (2.4.0) dotenv-rails (2.4.0)
退会済みユーザー

退会済みユーザー

2019/05/20 03:05 編集

すいません、`dotenv` は今回はあまり関係ありませんでした。 > ・.env の環境変数はいつ読み込まれるのか rails c や rails s を実行したときなどです。 dotenv は gem なので、要は gem が読み込まれるとき、です。
ya-mon

2019/05/20 05:29

puma で、rails アプリを起動したあと、rails console で、ENV["TEST"]を叩くと、.env の設定値が返ってきました。 一方で、ENV["RAILS_ENV"]を叩くと、development と返ってきます(設定値はproductionなのに)。 他の設定との競合など、考えられる可能性があれば教えていただきたいです。
ya-mon

2019/05/20 05:34

そもそも、rails コマンドは、.env の環境変数 RAILS_ENV に関係なく、デフォルトで development で動くものなのでしょうか? 質問が混乱しすみません。上記が最も知りたいです。
退会済みユーザー

退会済みユーザー

2019/05/20 05:59 編集

> rails コマンドは、.env の環境変数 RAILS_ENV に関係なく、デフォルトで development で動く 上記への回答としては、そのとおりです。 希望のことを行いたい場合には、おそらく今回は direnv を使うのが適しているのではないかと想像します。 あるいは、環境変数をコマンドで同時に指定したり、rails c ではコマンドラインオプションとして環境名が指定できるので、それを利用するのが良いかと思います。
ya-mon

2019/05/20 06:09

知りたいことがわかり非常に助かりました。ありがとうございます。
guest

0

ベストアンサー

この問題に関するdotenvの作者の回答

Doubtful. It's a bit of a chicken-egg problem.

鳥と卵の問題になるので怪しい。とのことです。

解説すると、dotenvはbundlerによって読み込まれます。
bundlerは環境によって読み込むgemを切り替えます。
ということは、bundlerからgemが読み込まれた時点で環境が決まっている必要があります。

なので、「dotenvからRAILS_ENVを上書きした場合、なんの問題もなく環境を切り替えられるかは怪しい」という事になります。


追記:
解決策っぽいものを見つけました。
以下をGemfileのrails直下あたりにgroup指定せずに記述するとよいでしょう。

dotenvの制限によりダメでした。

ruby

1gem 'dotenv-rails', require: 'dotenv/rails-now'

再追記

  1. group指定せずにgem dotenv-railsを記述する。
  2. .envRAILS_ENV=productionを記入
  3. config/boot.rbを編集

rb

1ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 2 3require 'bundler/setup' # Set up gems listed in the Gemfile. 4 5# 追加 6require 'dotenv' 7Dotenv.load 8 9require 'bootsnap/setup' # Speed up boot time by caching expensive operations.

というか、config/boot.rb冒頭にでもENV["RAILS_ENV"]="production"を書くだけでいい気もしてます。

投稿2019/05/21 03:34

編集2019/05/21 05:48
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ya-mon

2019/05/21 04:37

ご回答ありがとうございます。 bundler で dotenv を読み込む際の具体的なコマンドって、bundle install とかですか? bundler 実行時の RAILS_ENV は、bash の 環境変数を参照するのでしょうか?
asm

2019/05/21 04:56

railsコマンドの中でです。
ya-mon

2019/05/21 06:33

追記ありがとうございます。 config/boot.rb冒頭にENV["RAILS_ENV"]="production"を書けば解決しました。 ただ、dotenv で RAILS_ENV を使えない理由がよくわかっていません・・・ .env を読み込む時点で、すでに rails の実行モードが指定されているので、.env 内の RAILS_ENV は無効という認識で合っているでしょうか
asm

2019/05/21 07:23

Gemfileからgemを(vendor/.bundle以下などから) - 読み込めるようにする - enviromnentに従ってgemを一括読み込みする という2つの処理があり基本的にrails以外は後者によって読み込まれるので Gemfileに書いたdotenvが読み込まれるタイミングでは遅い かつ、dotenvは既に環境変数で設定されていた場合.envをもとに上書きはしないというポリシーになっている。 環境変数RAILS_ENVがない場合はdevelopmentを設定する という処理がrailsにあるらしいので dotenvが自動的に読み込まれた段階では.envからRAILS_ENVを設定するのは無理 という事になります。
ya-mon

2019/05/21 07:51

回答ありがとうございます。 すっきり理解できました。 理解が進んだので、ベストアンサーを変更させていただきます。
退会済みユーザー

退会済みユーザー

2019/05/21 22:15

asmさん、詳しい説明ありがとうございます。 私の方でも理解が進みました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問