ชิมเพื่อโหลดตัวแปรสภาพแวดล้อมจาก .env
ลงใน ENV
ในการ พัฒนา
การจัดเก็บการกำหนดค่าในสภาพแวดล้อมเป็นหนึ่งในหลักการของแอปสิบสองปัจจัย สิ่งใดก็ตามที่มีแนวโน้มที่จะเปลี่ยนแปลงระหว่างสภาพแวดล้อมการปรับใช้ เช่น การจัดการทรัพยากรสำหรับฐานข้อมูลหรือข้อมูลประจำตัวสำหรับบริการภายนอก ควรแยกออกจากโค้ดไปยังตัวแปรสภาพแวดล้อม
แต่การตั้งค่าตัวแปรสภาพแวดล้อมบนเครื่องที่กำลังพัฒนาหรือเซิร์ฟเวอร์การรวมอย่างต่อเนื่องที่มีการรันหลายโปรเจ็กต์อยู่นั้นอาจใช้ไม่ได้ผลเสมอไป dotenv โหลดตัวแปรจากไฟล์ .env
ลงใน ENV
เมื่อสภาพแวดล้อมถูกบู๊ต
เพิ่มบรรทัดนี้ที่ด้านบนของ Gemfile ของแอปพลิเคชันของคุณแล้วรัน bundle install
:
gem 'dotenv' , groups : [ :development , :test ]
เพิ่มการกำหนดค่าแอปพลิเคชันของคุณไปยังไฟล์ .env
ในรูทของโปรเจ็กต์ของคุณ:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
เมื่อใดก็ตามที่แอปพลิเคชันของคุณโหลด ตัวแปรเหล่านี้จะพร้อมใช้งานใน ENV
:
config . fog_directory = ENV [ 'S3_BUCKET' ]
ดูเอกสาร API สำหรับข้อมูลเพิ่มเติม
Dotenv จะโหลดโดยอัตโนมัติเมื่อแอป Rails ของคุณบูท ดูการปรับแต่ง Rails เพื่อเปลี่ยนไฟล์ที่จะโหลดและเวลา
โหลด Dotenv โดยเร็วที่สุดในกระบวนการบูตสแตรปของแอปพลิเคชันของคุณ:
require 'dotenv/load'
# or
require 'dotenv'
Dotenv . load
ตามค่าเริ่มต้น load
จะค้นหาไฟล์ชื่อ .env
ในไดเร็กทอรีการทำงานปัจจุบัน ส่งผ่านหลายไฟล์แล้วไฟล์เหล่านั้นจะถูกโหลดตามลำดับ ค่าแรกที่ตั้งไว้สำหรับตัวแปรจะชนะ
require 'dotenv'
Dotenv . load ( 'file1.env' , 'file2.env' )
ตั้งแต่ 3.0 เป็นต้นมา dotenv ในแอป Rails จะกู้คืน ENV
โดยอัตโนมัติหลังการทดสอบแต่ละครั้ง ซึ่งหมายความว่าคุณสามารถแก้ไข ENV
ในการทดสอบได้โดยไม่ต้องกลัวว่าสถานะจะรั่วไหลไปสู่การทดสอบอื่นๆ ใช้งานได้กับทั้ง ActiveSupport::TestCase
และ Rspec
หากต้องการปิดใช้งานพฤติกรรมนี้ ให้ตั้งค่า config.dotenv.autorestore = false
ใน config/application.rb
หรือ config/environments/test.rb
มันถูกปิดใช้งานโดยค่าเริ่มต้นหากแอปของคุณใช้ climate_control หรือ ice_age
หากต้องการใช้ลักษณะการทำงานนี้นอกแอป Rails เพียง require "dotenv/autorestore"
ในชุดทดสอบของคุณ
ดู Dotenv.save
, Dotenv.restore และ Dotenv.modify(hash) { ... }
สำหรับการใช้งานด้วยตนเอง
เพื่อให้แน่ใจว่า .env
ถูกโหลดใน rake ให้โหลดงาน:
require 'dotenv/tasks'
task mytask : :dotenv do
# things that require .env
end
คุณสามารถใช้โหลดปฏิบัติการ dotenv
.env
ก่อนที่จะเปิดแอปพลิเคชันของคุณ:
$ dotenv ./script.rb
โปรแกรมปฏิบัติการ dotenv
ยังยอมรับแฟล็ก -f
ค่าควรเป็นรายการไฟล์การกำหนดค่าที่คั่นด้วยเครื่องหมายจุลภาค ตามลำดับจากสำคัญที่สุดไปน้อยที่สุด ไฟล์ทั้งหมดจะต้องมีอยู่ จะต้อง มีช่องว่างระหว่างแฟล็กและค่าของมัน
$ dotenv -f " .env.local,.env " ./script.rb
โปรแกรมปฏิบัติการ dotenv
สามารถเลือกที่จะละเว้นไฟล์ที่หายไปด้วยแฟล็ก -i
หรือ --ignore
ตัวอย่างเช่น หากไม่มีไฟล์ .env.local
ไฟล์ต่อไปนี้จะละเว้นไฟล์ที่หายไปและโหลดเฉพาะไฟล์ .env
เท่านั้น
$ dotenv -i -f " .env.local,.env " ./script.rb
หากคุณใช้อัญมณีที่ต้องตั้งค่าตัวแปรสภาพแวดล้อมก่อนที่จะโหลด ให้แสดงรายการ dotenv
ใน Gemfile
ก่อนอัญมณีอื่นๆ เหล่านั้นและต้องใช้ dotenv/load
gem 'dotenv' , require : 'dotenv/load'
gem 'gem-that-requires-env-variables'
Dotenv จะโหลดไฟล์ต่อไปนี้ขึ้นอยู่กับ RAILS_ENV
โดยไฟล์แรกมีความสำคัญสูงสุด และ .env
มีความสำคัญน้อยที่สุด:
ลำดับความสำคัญ | สิ่งแวดล้อม | .gitignore มันเหรอ? | หมายเหตุ | ||
---|---|---|---|---|---|
การพัฒนา | ทดสอบ | การผลิต | |||
สูงสุด | .env.development.local | .env.test.local | .env.production.local | ใช่ | การแทนที่เฉพาะสภาพแวดล้อม |
2 | .env.local | ไม่มี | .env.local | ใช่ | การแทนที่ในเครื่อง |
3 | .env.development | .env.test | .env.production | เลขที่ | ตัวแปรเฉพาะสภาพแวดล้อมที่ใช้ร่วมกัน |
ล่าสุด | .env | .env | .env | อาจจะ | แบ่งปันสำหรับทุกสภาพแวดล้อม |
ไฟล์เหล่านี้ถูกโหลดระหว่างการเรียกกลับ before_configuration
ซึ่งเกิดขึ้นเมื่อกำหนดค่าคงที่ Application
ชันใน config/application.rb
ด้วย class Application < Rails::Application
หากคุณต้องการให้เริ่มต้นเร็วขึ้น หรือจำเป็นต้องปรับแต่งกระบวนการโหลด คุณสามารถทำได้ที่ด้านบนของ 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
ตัวเลือกที่มี:
Dotenv::Rails.files
- รายการไฟล์ที่จะโหลด โดยเรียงลำดับตามลำดับความสำคัญDotenv::Rails.overwrite
- เขียนทับตัวแปร ENV
ที่มีอยู่ด้วยเนื้อหาของไฟล์ .env*
Dotenv::Rails.logger
- ตัวบันทึกที่จะใช้สำหรับการบันทึกของ dotenv ค่าเริ่มต้นเป็น Rails.logger
Dotenv::Rails.autorestore
- เปิดหรือปิดใช้งานการกู้คืนอัตโนมัติค่าหลายบรรทัดที่มีการขึ้นบรรทัดใหม่ต้องล้อมรอบด้วยเครื่องหมายคำพูดคู่
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY----- "
ก่อนเวอร์ชัน 3.0 dotenv จะแทนที่ n
ในสตริงที่ยกมาด้วยการขึ้นบรรทัดใหม่ แต่พฤติกรรมดังกล่าวเลิกใช้แล้ว หากต้องการใช้ลักษณะการทำงานแบบเก่า ให้ตั้งค่า DOTENV_LINEBREAK_MODE=legacy
ก่อนตัวแปรใดๆ ที่มี n
:
DOTENV_LINEBREAK_MODE=legacy
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----nHkVN9...n-----END DSA PRIVATE KEY-----n "
คุณต้องเพิ่มผลลัพธ์ของคำสั่งลงในตัวแปรตัวใดตัวหนึ่งของคุณหรือไม่? เพียงเพิ่มด้วย $(your_command)
:
DATABASE_URL= " postgres:// $( whoami ) @localhost/my_database "
คุณต้องเพิ่มค่าของตัวแปรอื่นในตัวแปรตัวใดตัวหนึ่งของคุณหรือไม่? คุณสามารถอ้างอิงตัวแปรด้วย ${VAR}
หรือมักจะเพียง $VAR
ในค่าที่ไม่มีเครื่องหมายคำพูดหรือเครื่องหมายคำพูดคู่
DATABASE_URL= " postgres:// ${USER} @localhost/my_database "
หากค่ามี $
และไม่ได้ตั้งใจให้เป็นตัวแปร ให้ใส่เครื่องหมายคำพูดเดี่ยว
PASSWORD= ' pas$word '
ความคิดเห็นอาจถูกเพิ่มลงในไฟล์ของคุณดังนี้:
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH= " something-with-a-#-hash "
เพื่อความเข้ากันได้ คุณสามารถเพิ่ม export
ที่ด้านหน้าของแต่ละบรรทัดเพื่อให้คุณสามารถ source
ไฟล์ใน bash:
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
หากจำเป็นต้องใช้ค่าการกำหนดค่าเฉพาะแต่ไม่ได้ตั้งค่า อาจทำให้เกิดข้อผิดพลาดได้
หากต้องการใช้คีย์การกำหนดค่า:
# config/initializers/dotenv.rb
Dotenv . require_keys ( "SERVICE_APP_ID" , "SERVICE_KEY" , "SERVICE_SECRET" )
หากไม่ได้ตั้งค่าคีย์การกำหนดค่าข้างต้น แอปพลิเคชันของคุณจะทำให้เกิดข้อผิดพลาดระหว่างการเริ่มต้น แนะนำให้ใช้วิธีนี้เนื่องจากจะป้องกันข้อผิดพลาดรันไทม์ในแอปพลิเคชันที่ใช้งานจริงเนื่องจากการกำหนดค่าที่ไม่เหมาะสม
หากต้องการแยกวิเคราะห์รายการไฟล์ env สำหรับการตรวจสอบทางโปรแกรมโดยไม่ต้องแก้ไข ENV:
Dotenv . parse ( ".env.local" , ".env" )
# => {'S3_BUCKET' => 'YOURS3BUCKET', 'SECRET_KEY' => 'YOURSECRETKEYGOESHERE', ...}
เมธอดนี้ส่งคืนแฮชของคู่ชื่อ/ค่า var ของ ENV
คุณสามารถใช้แฟล็ก -t
หรือ --template
บน dotenv cli เพื่อสร้างเทมเพลตของไฟล์ .env
ของคุณ
$ dotenv -t .env
เทมเพลตจะถูกสร้างขึ้นในไดเร็กทอรีการทำงานของคุณชื่อ {FILENAME}.template
ดังนั้นในตัวอย่างข้างต้น มันจะสร้างไฟล์ . .env.template
เทมเพลตจะมีตัวแปรสภาพแวดล้อมทั้งหมดในไฟล์ .env
ของคุณ แต่ตั้งค่าเป็นชื่อตัวแปร
# .env
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
ก็จะกลายเป็น
# .env.template
S3_BUCKET=S3_BUCKET
SECRET_KEY=SECRET_KEY
เดิม dotenv ถูกสร้างขึ้นเพื่อโหลดตัวแปรการกำหนดค่าลงใน ENV
ในการ พัฒนา โดยทั่วไปมีวิธีที่ดีกว่าในการจัดการการกำหนดค่าในสภาพแวดล้อมการใช้งานจริง เช่น /etc/environment
ที่จัดการโดย Puppet หรือ Chef, heroku config
เป็นต้น
อย่างไรก็ตาม บางคนพบว่า dotenv เป็นวิธีที่สะดวกในการกำหนดค่าแอปพลิเคชัน Rails ในสภาพแวดล้อมการแสดงละครและการใช้งานจริง และคุณสามารถทำได้โดยการกำหนดไฟล์เฉพาะสภาพแวดล้อม เช่น .env.production
หรือ .env.test
หากคุณใช้ gem นี้เพื่อจัดการ env vars สำหรับสภาพแวดล้อม Rails หลายรายการ (การพัฒนา การทดสอบ การผลิต ฯลฯ) โปรดทราบว่า env vars ทั่วไปสำหรับทุกสภาพแวดล้อมควรถูกเก็บไว้ใน .env
จากนั้น env vars เฉพาะสภาพแวดล้อมควรถูกเก็บไว้ใน .env.<that environment's name>
ข้อมูลรับรองควรสามารถเข้าถึงได้บนเครื่องที่ต้องการเข้าถึงเท่านั้น อย่าส่งข้อมูลที่ละเอียดอ่อนไปยังพื้นที่เก็บข้อมูลซึ่งไม่จำเป็นสำหรับเครื่องพัฒนาและเซิร์ฟเวอร์ทุกเครื่อง
โดยส่วนตัวแล้ว ฉันชอบส่งไฟล์ .env
ด้วยการตั้งค่าสำหรับการพัฒนาเท่านั้น สิ่งนี้ทำให้นักพัฒนารายอื่นสามารถเริ่มต้นโปรเจ็กต์ได้อย่างง่ายดาย โดยไม่กระทบต่อข้อมูลประจำตัวสำหรับสภาพแวดล้อมอื่นๆ หากคุณทำตามคำแนะนำนี้ ตรวจสอบให้แน่ใจว่าข้อมูลประจำตัวทั้งหมดสำหรับสภาพแวดล้อมการพัฒนาของคุณแตกต่างจากการปรับใช้อื่นๆ ของคุณ และข้อมูลประจำตัวการพัฒนาไม่สามารถเข้าถึงข้อมูลที่เป็นความลับใดๆ
ENV
ที่มีอยู่ ตามค่าเริ่มต้น จะไม่ เขียนทับตัวแปรสภาพแวดล้อมที่มีอยู่ เนื่องจาก dotenv ถือว่าสภาพแวดล้อมการปรับใช้มีความรู้เกี่ยวกับการกำหนดค่ามากกว่าที่แอปพลิเคชันมี หากต้องการเขียนทับตัวแปรสภาพแวดล้อมที่มีอยู่ คุณสามารถใช้ Dotenv.load files, overwrite: true
คุณยังสามารถใช้แฟล็ก -o
หรือ --overwrite
บน dotenv cli เพื่อเขียนทับตัวแปร ENV
ที่มีอยู่
$ dotenv -o -f " .env.local,.env "
หากคุณต้องการแนวคิดที่ดีขึ้นเกี่ยวกับวิธีการทำงานของ dotenv ลองดูการอ่านโค้ด Ruby Rogues ของ dotenv
git checkout -b my-new-feature
)git commit -am 'Added some feature'
)git push origin my-new-feature
)