คุณพร้อมที่จะเปิดตัวแอปสำหรับใช้งานจริงครั้งแรกแล้ว และได้เวลาพูดคุยกับบริการภายนอกบางอย่างแล้ว คุณยังต้องทำให้ทุกอย่างเกี่ยวพันกัน แล้ววิธีใดดีที่สุดในการกำหนดค่าบริการของคุณในการผลิตโดยไม่ทำให้สิ่งต่างๆ ซับซ้อนขึ้นในเครื่อง dev ของคุณ
ตั้งค่าสภาพแวดล้อมของคุณ
ในการกำหนดค่าแอปที่ใช้งานจริง แนวทางปฏิบัติที่ดีที่สุดของวันนี้คือการใช้ตัวแปรสภาพแวดล้อม (ENV["REDIS_HOST"]
เหล่านั้น -มองสิ่งของ)
แต่ทำไม?
-
การคอมมิตคีย์การผลิตโดยไม่ได้ตั้งใจทำได้ยากกว่า
หากคุณไม่สนใจ คุณอาจ
git push
ไฟล์ที่มีคีย์ลับที่สำคัญอยู่ในนั้น และนั่นอาจเป็นความผิดพลาดราคาแพง -
การกำหนดค่าคือสิ่งที่ตัวแปรสภาพแวดล้อมมีไว้สำหรับ
ตัวแปรสภาพแวดล้อมเป็นวิธีทั่วไปในการกำหนดค่าแอพในเกือบทุกระบบ โปรแกรมอื่นๆ มากมาย (เช่น Ruby) ใช้ตัวแปรสภาพแวดล้อมสำหรับการกำหนดค่า ดังนั้นจึงควรลองใช้ในแอปของคุณเองเท่านั้น
-
ตัวแปรสภาพแวดล้อมนั้นง่ายต่อการตั้งค่าในการผลิต
Heroku มีเว็บ UI และเครื่องมือบรรทัดคำสั่งสำหรับการตั้งค่าตัวแปรสภาพแวดล้อมอย่างง่ายดาย และหากคุณกำลังสร้างเซิร์ฟเวอร์ของคุณเอง เครื่องมือการจัดการเซิร์ฟเวอร์ เช่น Chef และ Docker จะทำให้การตั้งค่าตัวแปรสภาพแวดล้อมทำได้ง่าย
ด้านข้าง Rails มีลักษณะอย่างไร
นี่คือวิธีที่แอปที่ขึ้นอยู่กับตัวแปรสภาพแวดล้อมสามารถกำหนดค่าเองได้:
production:
host: <%= ENV["MY_SERVICE_HOST"] %>
port: <%= ENV["MY_SERVICE_PORT"] %>
my_service_config = Rails.application.config_for(:my_service)
my_service = MyService.new(my_service_config["host"], my_service_config["port"])
ตัวเริ่มต้นใช้ config_for
ของ Rails 4.2 วิธีการหา .yml
. ที่ถูกต้อง ไฟล์และเลือกสภาพแวดล้อมที่เหมาะสม
จากนั้น config_for
เรียกใช้ ERB
รหัสภายใน my_service.yml
และคว้า MY_SERVICE_HOST
และ MY_SERVICE_PORT
ออกจากสิ่งแวดล้อม มันส่งค่าเหล่านั้นไปยัง MyService
.
คุณยังสามารถให้ initializer อ่านจาก ENV["MY_SERVICE_HOST"]
โดยตรง. แต่ฉันชอบเก็บไว้ใน .yml
ไฟล์ด้วยเหตุผลที่คุณจะเห็นในไม่กี่นาที
การกำหนดค่าแอปของคุณอยู่ในระหว่างการพัฒนา
ตัวแปรสภาพแวดล้อมนั้นใช้ได้สำหรับการผลิต แต่เมื่อคุณตั้งค่าคอนฟิกการผลิตแล้ว คุณจะจัดการกับโหมดการพัฒนาและทดสอบอย่างไร
คุณมีตัวเลือกน้อย แต่ฉันมักจะทำตามแบบแผนใน config/secrets.yml
. ของ Rails :ใช้ตัวแปรสภาพแวดล้อมในการผลิต และฮาร์ดโค้ดค่าที่ไม่เป็นความลับในการพัฒนาและทดสอบ
ด้วยสภาพแวดล้อมการพัฒนาและทดสอบ config/my_service.yml
อาจมีลักษณะดังนี้:
production:
host: <%= ENV["MY_SERVICE_HOST"] %>
port: <%= ENV["MY_SERVICE_PORT"] %>
development:
host: localhost
port: 8081
test:
host: localhost
port: 8081
เยี่ยมมาก ตัวเริ่มต้นสามารถเหมือนเดิมทุกประการ ค่าในไฟล์นี้จะถูกใช้ในสภาพแวดล้อมการพัฒนาและการทดสอบ และสภาพแวดล้อมการใช้งานจริงจะได้รับค่าจากตัวแปรสภาพแวดล้อม
แต่ทำไมคุณถึงฮาร์ดโค้ดค่าเหล่านี้?
-
ค่าของการกำหนดค่าจะมองเห็นและเปลี่ยนแปลงได้ง่ายขึ้น
คุณปรับแต่งการกำหนดค่าได้ขณะทดสอบฟีเจอร์ใหม่ ซึ่งเป็นสิ่งที่คุณต้องการในการพัฒนา แต่ไม่มากในเวอร์ชันที่ใช้งานจริง
-
การเริ่มต้นใช้งานใหม่จะง่ายกว่า
หากตัวอย่างการกำหนดค่าทั้งหมดที่คุณต้องการได้รับการตรวจสอบในที่เก็บ git ของคุณ ผู้พัฒนาใหม่จะต้องโคลนและเรียกใช้แอปของคุณ โดยไม่จำเป็นต้องยุ่งยากกับการตั้งค่าที่เหมาะสมเพื่อให้แอปทำงานได้
-
คุณไม่ต้องกังวลกับตัวแปรสภาพแวดล้อมที่ขัดแย้งกัน
คุณอาจจะทำงานกับแอพบนเครื่อง dev ของคุณมากกว่าที่คุณเคยปรับใช้กับเครื่องที่ใช้งานจริงเครื่องเดียว หากคุณใช้ตัวแปรสภาพแวดล้อมทั้งระบบเพื่อกำหนดค่าแอปทั้งหมด มีโอกาสดีที่แอปสองตัวจะกระทืบกัน
ดังนั้น ลองใช้ตัวแปรสภาพแวดล้อมในการผลิต และฮาร์ดโค้ด .yml
config ในการพัฒนา ง่าย อ่านได้ และ Rails ก็มีการสนับสนุนในตัวเพื่อจัดการกับไฟล์ปรับแต่งประเภทนั้นๆ
ตัวเลือกอื่นสำหรับการพัฒนา
มีอีกวิธีในการจัดการการกำหนดค่าในโหมดการพัฒนา:dotenv. มันดูเรียบร้อย แต่ฉันยังไม่ได้ลองใช้ในแอปของตัวเอง
ด้วย dotenv คุณสามารถใส่ตัวแปรสภาพแวดล้อมในไฟล์ชื่อ .env
ในไดเร็กทอรีรากของแอป Rails ของคุณ และค่าเหล่านั้นจะถูกเลือกโดยแอปของคุณ นี่เป็นสิ่งที่ดีเพราะสภาพแวดล้อมการพัฒนาของคุณทำหน้าที่เหมือนสภาพแวดล้อมการผลิตของคุณมากขึ้น นั่นเป็นวิธีที่ดีในการหลีกเลี่ยงข้อบกพร่องที่จะเกิดขึ้นในการผลิตเท่านั้น
เป็นสิ่งที่ฉันจะพยายามสักวันหนึ่ง แต่ตอนนี้ ยังไม่เจออะไรที่สะดวกไปกว่า .yml
และ config_for
.
แอพที่ใช้งานจริงส่วนใหญ่ต้องการการกำหนดค่าบางอย่าง ดังนั้น เมื่อคุณทำให้แอปถัดไปใช้งานได้ ให้ลองใช้ .yml
ไฟล์ที่เติมโดยตัวแปรสภาพแวดล้อมในการผลิตเพื่อกำหนดค่า คุณจะได้รับความยืดหยุ่น ความเรียบง่าย และความน่าเชื่อถือที่คุณคาดหวัง
คุณมีวิธีอื่นในการกำหนดค่าแอพที่ใช้งานจริงหรือไม่? แสดงความคิดเห็นฉันชอบที่จะได้ยินเกี่ยวกับเรื่องนี้!