はじめに
今回はRailsで扱ったことがあった.envをRubyで使おうとしたときにわからず困ってしまった所があったので、扱うためにどのようなことをすれば良いのかを書いていきたいと思います。
.env(dotenv)とは?
dotenvは環境変数を.envファイルからロードしてくれるGemになります。ソースコード内にデータベースへの接続文字列を直接書いてしまったり、パスワードを直接書いてしまったりすると、他の人が見れるようになるのでマズいのです。例えていうなら、銀行のキャッシュカードの端のところに暗証番号忘れないように油性ペンで書かれているようなものです。見られてはマズい文字列を別のファイル(.envファイル)として扱えるようにしたのがこのGemです。
使い方
1. Gemfileに記述する
Gemfileに以下を追加してください。
gem 'dotenv'
2. bundle install
する
bundle install
3. .envファイルを作成
次に自身のアプリケーションのルートディレクトリに.env
というファイルを作成します。
私の場合はDockerのコンテナにバインドさせるディレクトリに以下のように配置しました。
.
├── .env
├── Gemfile
├── Gemfile.lock
├── config
│ └── database.yml
├── create_products_table.sql
└── scraper.rb
4. .envファイルに書き込む
=の左側に参照するときの名前、=の右側に参照したい値(パスワードなど)を書き込んでください。
MYSQL_DATABASE=database
MYSQL_USER=username
MYSQL_PASSWORD=mypassword
5-1. Rubyのプログラムから読み込む
環境変数として持っているだけでは意味がないですからね、ここで先ほど.envに記載した内容を取り出して利用するわけですね。
require 'dotenv/load'
puts ENV['MYSQL_DATABASE']
5-2. yamlで利用する
または、yamlファイルの中で利用したいケースもあるかもしれません。たとえば「database.yml」ですね。
その場合はあらかじめyamlファイルで代入したい場所はerbを利用して参照します。
development:
<<: *default
database: <%= ENV['MYSQL_DATABASE'] %>
そしてそれをRubyのファイル内で参照するには以下のようにします。
require 'yaml'
require 'dotenv/load'
require 'erb'
db_config = YAML.load(ERB.new(File.read('./config/database.yml')).result, aliases: true)
まとめ
今回はRubyで.envを使う方法を解説しましたが、Railsで使用するときと違って何でもやってくれるわけではない(全部自分で実装しないとならない)のでその辺が大変だと感じました。Railsで使ったことがあったので、同じように使えば良いだろうと安易に導入して苦労しました。
この記事が皆さんの一助となりましたら幸いです。