ตัวแปรสภาพแวดล้อม (environment variable) เป็นคู่คีย์/ค่า (key/value pair) มันมีลักษณะแบบนี้:
KEY=VALUE
เราใช้ตัวแปรเหล่านี้เพื่อแชร์ตัวเลือกการกำหนดค่าระหว่างโปรแกรมทั้งหมดในคอมพิวเตอร์ของคุณ
นั่นคือเหตุผลที่สำคัญที่จะต้องเรียนรู้ว่ามันทำงานอย่างไร และวิธีเข้าถึงจากโปรแกรม Ruby ของคุณโดยใช้ตัวแปรพิเศษ ENV
ตัวอย่างตัวแปรสภาพแวดล้อม:
- กำหนดค่าเอนิทเตอร์เริ่มต้น (default editor)
- บอก Ruby ว่าจะหา gems ที่ไหน (
GEM_PATH/GEM_HOME) - ส่ง API keys เข้าแอปพลิเคชัน โดยไม่ต้องคอมมิตลง source control (git)
- กำหนดว่าระบบปฏิบัติการควรหาไฟล์ไบนารี (.exe ใน Windows) ที่ไหน
- ทำให้ Rails เริ่มในโหมด test/development/production
คุณสามารถหารายการตัวแปรสภาพแวดล้อมทั้งหมดได้ด้วยคำสั่ง env ใน Linux/Mac และคำสั่ง set ใน Windows
ตัวอย่าง:
PWD=/home/jesus SHELL=/usr/bin/zsh RUBY_ENGINE=ruby RUBY_VERSION=2.6.0 GEM_ROOT=/opt/rubies/ruby-2.6.0/lib/ruby/gems/2.6.0 # ...
รายการอาจยาวมาก แตคุณไม่ต้องจดจำ
คุณยังสามารถพิมพ์ตัวแปรและการกำหนดค่าเฉพาะ gem ทั้งหมดได้ด้วยคำสั่ง gem env
ตอนนี้:
หากคุณต้องการเข้าถึงตัวแปรสภาพแวดล้อมเหล่านี้จาก Ruby มีออบเจ็กต์พิเศษที่คุณสามารถใช้ได้
มาค้นพบว่ามันทำงานอย่างไร!
การใช้ตัวแปรสภาพแวดล้อมใน Ruby
Ruby มีออบเจ็กต์ ENV นี้ที่ทำงานเหมือนแฮช (hash) และให้คุณเข้าถึงตัวแปรสภาพแวดล้อมทั้งหมดที่พร้อมใช้งาน
นี่คือตัวอย่างบางส่วน...
คุณสามารถหาได้ว่ามีคีย์กี่ตัว:
ENV.size # 48
รับรายการของพวกมัน:
ENV.keys
และเข้าถึงคีย์เฉพาะ:
ENV["GEM_HOME"] # "/home/jesus/.gem/ruby/2.6.0"
คุณแม้แต่สามารถใช้เมธอดเช่น map และ select ได้:
ENV.select { |k,v| k.size < 4 }
แตคุณตั้งค่าตัวแปรสภาพแวดล้อมเหล่านี้ภายนอก Ruby อย่างไร?
วิธีตั้งค่าตัวแปรสภาพแวดล้อม
คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมสำหรับการใช้งานครั้งเดียว
แบบนี้:
API_KEY=1 ruby -e 'p ENV["API_KEY"]'
ใช้สิ่งนี้ในเทอร์มินัล นอกเหนือจาก irb แล้ว Ruby จะเข้าถึงค่า API_KEY นี้ได้
สิ่งนี้ช่วยได้สำหรับ API keys แตก็สำหรับตั้งค่าโหมด Rails
ตัวอย่าง:
RAILS_ENV=production rails console
จำไว้:
สิ่งนี้ตั้งค่าตัวแปรสภาพแวดล้อมเฉพาะนี้สำหรับกระบวนการ (process) ที่คุณกำลังเปิดอยู่ตอนนี้
หมายความว่าหากฉันทำ API_KEY=1 <command>...
มันจะทำงานเฉพาะคำสั่งนั้นเท่านั้น!
หากคุณต้องการให้ตัวแปรนี้ถูกใช้โดยคำสั่งอื่นๆ ทั้งหมดที่คุณเปิดจากเซสชันเทอร์มินัลปัจจุบัน
ทำแบบนี้:
export API_KEY=1
ตอนนี้ หากคุณทำ:
ruby -e 'p ENV["API_KEY"]'
คุณจะได้ 1 แม้โดยไม่มีตัวแปรนำหน้า
คำเตือน:
อย่าใช้ ENV สำหรับการกำหนดค่าภายในแอปพลิเคชัน Ruby ของคุณ นั่น ไม่ใช่ วัตถุประสงค์ของมัน ENV ใช้สำหรับอ่านการกำหนดค่าภายนอกที่มาจากนอก Ruby เท่านั้น
ลองใช้ gem เช่น dry-configurable สำหรับตัวเลือกการกำหนดค่าภายใน
แอตทริบิวต์สำคัญของตัวแปรสภาพแวดล้อม
คุณอาจพบแอตทริบิวต์เหล่านี้มีประโยชน์ เพราะมันอธิบายพฤติกรรม (ที่อาจไม่คาดคิด)
- Snapshotting ตัวแปรสภาพแวดล้อมถูกตั้งค่าเมื่อคุณเปิดโปรแกรม และไม่ได้รับผลกระทบจากการเปลี่ยนแปลงภายนอก
- Closed environment การเปลี่ยนแปลงตัวแปรภายในกระบวนการ (โปรแกรม Ruby ของคุณคือกระบวนการ) ไม่เปลี่ยนตัวแปรสภาพแวดล้อมภายนอกกระบวนการ
- ตัวแปรสภาพแวดล้อมไม่ถาวร เมื่อคุณรีบูทคอมพิวเตอร์ หรือแม้แต่ปิดเทอร์มินัล การเปลี่ยนแปลงตัวแปรสภาพแวดล้อมจะหายไป (แม้คุณจะใช้
exportLinux + Mac /setใน Windows)
จดจำสิ่งเหล่านี้ไว้!
Rails Credentials
Rails 5.2 นำเสนอระบบใหม่เพื่อช่วยคุณจัดการ API keys
มันทำงานโดยบันทึก credentials โดยตรงไปที่ config/credentials.yml.enc นี่คือไฟล์ที่เข้ารหัสแล้ว ที่คุณสามารถอ่านได้ก็ต่อเมื่อคุณมีไฟล์ master.key
แนวคิดคือ คุณคอมมิตแค่ credentials.yml.enc และเก็บ key ไว้เป็นส่วนตัว
คุณเพิ่ม credentials ใหม่อย่างไร?
จริงๆ แล้วคุณไม่สามารถแก้ไขไฟล์ .enc โดยตรงได้
ใช้คำสั่งนี้แทน:
bin/rails credentials:edit
นี่คือไฟล์ YAML ตรวจสอบให้แน่ใจว่าจัดรูปแบบถูกต้อง
ตอนนี้:
คุณสามารถอ่าน credentials จากแอป Rails ของคุณได้แบบนี้...
Rails.application.credentials.github_api_key
ดูวิดีโอสอน
สรุป
คุณได้เรียนรู้เกี่ยวกับตัวแปรสภาพแวดล้อม เครื่องมือที่มีประโยชน์ที่ช่วยให้คุณจัดการการกำหนดค่าระบบปฏิบัติการ และเก็บ API keys ให้เป็นส่วนตัว

โปรดแชร์บทความนี้กับเพื่อนๆ ของคุณ เพื่อให้คนมากขึ้นหาเจอได้ 🙂
ขอบคุณที่อ่านครับ!