Shim untuk memuat variabel lingkungan dari .env
ke ENV
dalam pengembangan .
Menyimpan konfigurasi di lingkungan adalah salah satu prinsip aplikasi dua belas faktor. Apa pun yang mungkin berubah di antara lingkungan penerapan – seperti pegangan sumber daya untuk database atau kredensial untuk layanan eksternal – harus diekstraksi dari kode ke dalam variabel lingkungan.
Namun tidak selalu praktis untuk menetapkan variabel lingkungan pada mesin pengembangan atau server integrasi berkelanjutan di mana banyak proyek dijalankan. dotenv memuat variabel dari file .env
ke ENV
ketika lingkungan di-bootstrap.
Tambahkan baris ini ke bagian atas Gemfile aplikasi Anda dan jalankan bundle install
:
gem 'dotenv' , groups : [ :development , :test ]
Tambahkan konfigurasi aplikasi Anda ke file .env
di root proyek Anda:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
Setiap kali aplikasi Anda dimuat, variabel-variabel ini akan tersedia di ENV
:
config . fog_directory = ENV [ 'S3_BUCKET' ]
Lihat Dokumen API untuk informasi lebih lanjut.
Dotenv akan dimuat secara otomatis saat aplikasi Rails Anda boot. Lihat Menyesuaikan Rails untuk mengubah file mana yang dimuat dan kapan.
Muat Dotenv sedini mungkin dalam proses bootstrap aplikasi Anda:
require 'dotenv/load'
# or
require 'dotenv'
Dotenv . load
Secara default, load
akan mencari file bernama .env
di direktori kerja saat ini. Masukkan banyak file dan mereka akan dimuat secara berurutan. Nilai pertama yang ditetapkan untuk suatu variabel akan menang.
require 'dotenv'
Dotenv . load ( 'file1.env' , 'file2.env' )
Sejak 3.0, dotenv di aplikasi Rails akan secara otomatis memulihkan ENV
setelah setiap pengujian. Ini berarti Anda dapat memodifikasi ENV
dalam pengujian Anda tanpa takut membocorkan status ke pengujian lainnya. Ia bekerja dengan ActiveSupport::TestCase
dan Rspec
.
Untuk menonaktifkan perilaku ini, setel config.dotenv.autorestore = false
di config/application.rb
atau config/environments/test.rb
. Ini dinonaktifkan secara default jika aplikasi Anda menggunakan Climate_control atau Ice_age.
Untuk menggunakan perilaku ini di luar aplikasi Rails, cukup require "dotenv/autorestore"
di rangkaian pengujian Anda.
Lihat Dotenv.save
, Dotenv.restore, dan Dotenv.modify(hash) { ... }
untuk penggunaan manual.
Untuk memastikan .env
dimuat di rake, muat tugas:
require 'dotenv/tasks'
task mytask : :dotenv do
# things that require .env
end
Anda dapat menggunakan dotenv
executable load .env
sebelum meluncurkan aplikasi Anda:
$ dotenv ./script.rb
Eksekusi dotenv
juga menerima flag -f
. Nilainya harus berupa daftar file konfigurasi yang dipisahkan koma, dalam urutan dari yang paling penting hingga yang paling penting. Semua file harus ada. Harus ada spasi antara bendera dan nilainya.
$ dotenv -f " .env.local,.env " ./script.rb
Eksekusi dotenv
secara opsional dapat mengabaikan file yang hilang dengan tanda -i
atau --ignore
. Misalnya, jika file .env.local
tidak ada, tindakan berikut akan mengabaikan file yang hilang dan hanya memuat file .env
.
$ dotenv -i -f " .env.local,.env " ./script.rb
Jika Anda menggunakan permata yang memerlukan variabel lingkungan untuk disetel sebelum dimuat, maka cantumkan dotenv
di Gemfile
sebelum permata lainnya dan require dotenv/load
.
gem 'dotenv' , require : 'dotenv/load'
gem 'gem-that-requires-env-variables'
Dotenv akan memuat file-file berikut tergantung pada RAILS_ENV
, dengan file pertama memiliki prioritas tertinggi, dan .env
memiliki prioritas terendah:
Prioritas | Lingkungan | .gitignore saja? | Catatan | ||
---|---|---|---|---|---|
perkembangan | tes | produksi | |||
paling tinggi | .env.development.local | .env.test.local | .env.production.local | Ya | Penggantian lokal khusus lingkungan |
ke-2 | .env.local | T/A | .env.local | Ya | Penggantian lokal |
ke-3 | .env.development | .env.test | .env.production | TIDAK | Variabel khusus lingkungan bersama |
terakhir | .env | .env | .env | Mungkin | Dibagikan untuk semua lingkungan |
File-file ini dimuat selama callback before_configuration
, yang diaktifkan ketika konstanta Application
didefinisikan dalam config/application.rb
dengan class Application < Rails::Application
. Jika Anda memerlukannya untuk diinisialisasi lebih cepat, atau perlu menyesuaikan proses pemuatan, Anda dapat melakukannya di bagian atas application.rb
# config/application.rb
Bundler . require ( * Rails . groups )
# Load .env.local in test
Dotenv :: Rails . files . unshift ( ".env.local" ) if ENV [ "RAILS_ENV" ] == "test"
module YourApp
class Application < Rails :: Application
# ...
end
end
Opsi yang tersedia:
Dotenv::Rails.files
- daftar file yang akan dimuat, dalam urutan prioritas.Dotenv::Rails.overwrite
- Timpa variabel ENV
yang ada dengan konten file .env*
Dotenv::Rails.logger
- Logger yang digunakan untuk logging dotenv. Defaultnya adalah Rails.logger
Dotenv::Rails.autorestore
- Mengaktifkan atau menonaktifkan pemulihan otomatisNilai multi-baris dengan jeda baris harus diapit dengan tanda kutip ganda.
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY----- "
Sebelum versi 3.0, dotenv akan mengganti n
dalam string yang dikutip dengan baris baru, tetapi perilaku tersebut tidak digunakan lagi. Untuk menggunakan perilaku lama, setel DOTENV_LINEBREAK_MODE=legacy
sebelum variabel apa pun yang menyertakan n
:
DOTENV_LINEBREAK_MODE=legacy
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----nHkVN9...n-----END DSA PRIVATE KEY-----n "
Anda perlu menambahkan output dari suatu perintah di salah satu variabel Anda? Cukup tambahkan dengan $(your_command)
:
DATABASE_URL= " postgres:// $( whoami ) @localhost/my_database "
Anda perlu menambahkan nilai variabel lain di salah satu variabel Anda? Anda dapat mereferensikan variabel dengan ${VAR}
atau sering kali hanya $VAR
dalam nilai yang tidak diberi tanda kutip atau diberi tanda kutip ganda.
DATABASE_URL= " postgres:// ${USER} @localhost/my_database "
Jika suatu nilai berisi $
dan tidak dimaksudkan sebagai variabel, masukkan dalam tanda kutip tunggal.
PASSWORD= ' pas$word '
Komentar dapat ditambahkan ke file Anda seperti:
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH= " something-with-a-#-hash "
Untuk kompatibilitas, Anda juga dapat menambahkan export
di depan setiap baris sehingga Anda dapat source
file dalam bash:
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
Jika nilai konfigurasi tertentu diperlukan tetapi tidak disetel, maka wajar jika terjadi kesalahan.
Untuk memerlukan kunci konfigurasi:
# config/initializers/dotenv.rb
Dotenv . require_keys ( "SERVICE_APP_ID" , "SERVICE_KEY" , "SERVICE_SECRET" )
Jika salah satu kunci konfigurasi di atas tidak disetel, aplikasi Anda akan memunculkan kesalahan selama inisialisasi. Metode ini lebih disukai karena mencegah kesalahan runtime dalam aplikasi produksi karena konfigurasi yang tidak tepat.
Untuk mengurai daftar file env untuk pemeriksaan terprogram tanpa mengubah ENV:
Dotenv . parse ( ".env.local" , ".env" )
# => {'S3_BUCKET' => 'YOURS3BUCKET', 'SECRET_KEY' => 'YOURSECRETKEYGOESHERE', ...}
Metode ini mengembalikan hash dari pasangan nama/nilai var ENV.
Anda dapat menggunakan tanda -t
atau --template
pada cli dotenv untuk membuat templat file .env
Anda.
$ dotenv -t .env
Sebuah templat akan dibuat di direktori kerja Anda dengan nama {FILENAME}.template
. Jadi pada contoh di atas, itu akan membuat file .env.template
.
Templat akan berisi semua variabel lingkungan dalam file .env
Anda tetapi nilainya ditetapkan ke nama variabel.
# .env
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
Akan menjadi
# .env.template
S3_BUCKET=S3_BUCKET
SECRET_KEY=SECRET_KEY
dotenv awalnya dibuat untuk memuat variabel konfigurasi ke dalam ENV
dalam pengembangan . Biasanya ada cara yang lebih baik untuk mengelola konfigurasi di lingkungan produksi - seperti /etc/environment
yang dikelola oleh Puppet atau Chef, heroku config
, dll.
Namun, beberapa orang menganggap dotenv sebagai cara mudah untuk mengonfigurasi aplikasi Rails di lingkungan pementasan dan produksi, dan Anda dapat melakukannya dengan mendefinisikan file khusus lingkungan seperti .env.production
atau .env.test
.
Jika Anda menggunakan permata ini untuk menangani env vars untuk beberapa lingkungan Rails (pengembangan, pengujian, produksi, dll.), harap dicatat bahwa env vars yang umum untuk semua lingkungan harus disimpan di .env
. Kemudian, env var khusus lingkungan harus disimpan di .env.
.
Kredensial hanya boleh diakses pada mesin yang memerlukan akses ke sana. Jangan pernah memasukkan informasi sensitif ke repositori yang tidak diperlukan oleh setiap mesin dan server pengembangan.
Secara pribadi, saya lebih suka mengkomit file .env
dengan pengaturan khusus pengembangan. Hal ini memudahkan pengembang lain untuk memulai proyek tanpa mengorbankan kredensial untuk lingkungan lain. Jika Anda mengikuti saran ini, pastikan semua kredensial untuk lingkungan pengembangan Anda berbeda dari penerapan Anda yang lain dan kredensial pengembangan tidak memiliki akses ke data rahasia apa pun.
ENV
yang ada? Secara default, ini tidak akan menimpa variabel lingkungan yang ada karena dotenv mengasumsikan lingkungan penerapan memiliki lebih banyak pengetahuan tentang konfigurasi daripada aplikasi. Untuk menimpa variabel lingkungan yang ada, Anda dapat menggunakan Dotenv.load files, overwrite: true
.
Anda juga dapat menggunakan tanda -o
atau --overwrite
pada dotenv cli untuk menimpa variabel ENV
yang ada.
$ dotenv -o -f " .env.local,.env "
Jika Anda ingin ide yang lebih baik tentang cara kerja dotenv, lihat Pembacaan Kode Ruby Rogues dari dotenv.
git checkout -b my-new-feature
)git commit -am 'Added some feature'
)git push origin my-new-feature
)