.env VS config.ini 環境情報の設定ファイルはどちらがスマート!?!?[Heroku×Pythonで検証]
はじめに
本番環境と、開発するためのローカル環境、それぞれの環境設定、インストールしたドライブのパスの違いなど、どのように管理していますか?
私は以前そういった環境変数的なものは全てconfig.iniファイルにまとめていました。。。
ただ、今回.envでの管理の方がはるかに良い、スマートだ!!!ということに気づいたのでその話をしたいです。
以下、Herokuの環境でPythonを使っていますが、どの環境でも同じことがいえると思います。
config.iniの場合
まず、config.iniでまとめた場合、以下のように、config.iniファイルを作成します。
※ここではローカルの環境設定になっています。
[config.ini]
[DEFAULT]
WEBDRIVER_PATH = C:\\Users\\User\\chromedriver_win32\\chromedriver
それから、config.iniファイルを読み込むように、main.pyにコードを追加します。
[main.py]
import configparser
# read confing file
config_ini = configparser.ConfigParser()
config_ini.read('config.ini', encoding='utf-8')
webdriver_path = config_ini.get('DEFAULT', 'ChromeWebDriverPath')
そして、config.iniを本番設定に書き換えるためのpythonファイルを作ります。
[config_convert.py]
import configparser
# read confing file
config_ini = configparser.ConfigParser()
config_ini.read('config.ini', encoding='utf-8')
# configファイルの設定値を変更
config_ini['DEFAULT']['WEBDRIVER_PATH'] = '/app/.chromedriver/bin/chromedriver'
# 実際のconfigファイルを開いて、変更した設定値で書き換える
with open('config.ini', 'w') as file:
config_ini.write(file, True)
このpythonを実行すると、config.iniが以下のように本番環境の設定に変更されます。
[config.ini]
[DEFAULT]
WEBDRIVER_PATH = /app/.chromedriver/bin/chromedriver
あとは、これをHerokuデプロイ前に必ず実行するHerokuでデプロイするためのシェルスクリプトを書きます。
[deploy.sh]
python config_convert.py
git push heroku master
毎回デプロイするたびに、自動ではありますが、configファイルの設定を書き換える必要があります。なんかスマートではないです。。。。
.envを利用した場合
一方.envで管理する方法は、まず.envファイルを作成します。
[.env]
WEBDRIVER_PATH=C:\\Users\\JPTDKP\\chromedriver_win32\\chromedriver
pytohnから.envファイルを読み込むためload_dotenvをインストールします。
また、requirements.txtにも「load_dotenv」を追記しておきます。
※requirements.txt追記しなければエラーとなるので注意
pip install load_dotenv
それから.envファイルを読み込むように、main.pyにコードを追加します。
[main.py]
import os
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
webdriver_path = os.environ.get("WEBDRIVER_PATH")
次に、.envファイルは本番デプロイされないように.gitignoreファイルを作成します。
[.gitignore]
.env
あとは、Herokuの環境変数に「WEBDRIVER_PATH」を追加します。
本番環境はこの環境変数を参照するので、本番の環境情報にしておきます。
Herokuの環境変数はHerokuにログインし、Settings>Config Varsから以下のように設定できます。
※コマンドラインからも設定できますが、今回はGUIで設定します。
設定したら、ファイルをデプロイします。
まずは.gitignoreファイルのみgitコミットします
[terminal]
git add .gitignore
git commit -m 'create .gitignore'
その後、再度ほかのモジュールもコミットしてHerokuにデプロイします。
[terminal]
git add .
git commit -m '.env test'
git push heroku master
そうするとHeroku上では、Herokuで設定した環境変数が読み込まれ、ローカルでは、.envに記載している環境変数が読み込まれるようになります。
この設定をしておけば、毎回環境設定を書き換える等気にせずデプロイが可能です。
かなりスマート!!!
最後に
今回はconfig.ini vs .env という形で、環境設定の管理方法を見てきました。私の結論としては、.envがおすすめです!!
環境設定の管理方法については、正解がある話ではないため、更にスマートな方法がありましたら、是非コメント欄で教えていただきたいです!
よろしくお願いします!
この記事が気に入ったらサポートをしてみませんか?