hatenur
.env VS config.ini 環境情報の設定ファイルはどちらがスマート!?!?[Heroku×Pythonで検証]
見出し画像

.env VS config.ini 環境情報の設定ファイルはどちらがスマート!?!?[Heroku×Pythonで検証]

hatenur

はじめに


本番環境と、開発するためのローカル環境、それぞれの環境設定、インストールしたドライブのパスの違いなど、どのように管理していますか?

私は以前そういった環境変数的なものは全て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がおすすめです!!

環境設定の管理方法については、正解がある話ではないため、更にスマートな方法がありましたら、是非コメント欄で教えていただきたいです!
よろしくお願いします!



この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
hatenur
エンジニア兼ファイナンシャルプランナー 将来、ファイナンシャルの分野で、役に立つサービスをローンチしたいです。 python heroku awsを勉強中 技術系とファイナンシャル系の内容を投稿します https://mobile.twitter.com/HATENur_