แทนที่ ENV['HOME'] เพื่อการพัฒนาแอปบรรทัดคำสั่ง Ruby

ฉันกำลังสร้างแอปพลิเคชันบรรทัดคำสั่ง Ruby ที่มีคุณสมบัติดังต่อไปนี้:

  • โดยใช้เฟรมเวิร์ก GLI
  • แอปใช้ตัวแปร ENV['HOME'] สำหรับเส้นทางไปยังโฮมไดเร็กตอรี่ของผู้ใช้
  • ไฟล์การกำหนดค่าจะถูกเก็บไว้ภายใต้โฮมไดเร็กตอรี่ของผู้ใช้
  • แอปจะถูกปรับใช้เพื่อการใช้งานจริงในฐานะอัญมณี
  • การพัฒนาเสร็จสิ้นบนเครื่องเดียวกับที่ใช้แอปในการผลิต
  • การรวมกันของ Cucumber, RSpec และการเรียกใช้แอปผ่าน bundle exec bin/app_name ใช้เพื่อทดสอบสคริปต์ในการพัฒนา

แอปจัดการไฟล์ เป้าหมายของฉันคือเพื่อให้แน่ใจว่าอินสแตนซ์การพัฒนาทำงานบนสภาพแวดล้อมการพัฒนา/การทดสอบของตัวเองเท่านั้น ฉันเชื่อว่าแนวทางที่ดีคือการแทนที่ ENV['HOME'] เมื่อสคริปต์กำลังถูกเรียกใช้เพื่อการพัฒนา

มีวิธีการแทนที่ตัวแปร ENV['HOME'] หรือไม่ ไม่ว่าอย่างไร เมื่อใดก็ตามที่สคริปต์ทำงานในไดเร็กทอรีการพัฒนา มันจะไม่ใช้เส้นทาง ENV['HOME'] จริงหรือไม่


person Alan W. Smith    schedule 26.05.2014    source แหล่งที่มา
comment
คุณมีวิธีในการพิจารณาว่าสคริปต์นั้นเป็นเวอร์ชันการพัฒนาหรือไม่?   -  person matt    schedule 26.05.2014
comment
@matt นั่นเป็นส่วนหนึ่งของเคล็ดลับที่ฉันพยายามคิดออก (ฉันค่อนข้างใหม่กับสิ่งประเภทนี้ใน Ruby) ฉันคิดว่าฉันสามารถมีไฟล์ที่ทำหน้าที่เป็นสวิตช์ที่มีอยู่ใน dev แต่ไม่ได้นำไปใช้กับการใช้งานจริง ตอนนี้ฉันกำลังทำการทดลองด้วยวิธีนี้   -  person Alan W. Smith    schedule 26.05.2014


คำตอบ (1)


วิธีที่ฉันจะทำเช่นนี้คือเก็บเนื้อหาเฉพาะด้านการพัฒนาใดๆ ไม่ให้อยู่ในโค้ดแอปพลิเคชันจริง แต่ต้องมี Rakefile เพื่อใช้สำหรับการทดสอบระหว่างการพัฒนา ในนั้นคุณสามารถตรวจสอบให้แน่ใจว่าสภาพแวดล้อมได้รับการตั้งค่าอย่างเหมาะสม บางอย่างเช่น:

desc "Run the app"
task :exec do
  ENV['HOME']= "somewhere else"
  exec "./bin/your_binary"
end

จากนั้นคุณจะต้องรัน rake exec (หรือตั้งชื่องานให้ดีกว่านี้) เพื่อรันเวอร์ชันที่กำลังพัฒนา ในขณะที่ยังคงสามารถรันเวอร์ชันจริงได้ หากคุณเก็บไดเร็กทอรีการพัฒนา bin ของ PATH ของคุณไว้ ก็ไม่มีโอกาสที่จะรวมทั้งสองคำสั่งเข้าด้วยกัน

หากคุณต้องการที่จะรันเวอร์ชันการพัฒนาได้โดยตรง คุณสามารถใช้ข้อเท็จจริงที่ว่าเมื่อคุณรันไบนารี gems ไฟล์จริงที่ถูกเรียกใช้งานจะเป็นไฟล์ wrapper ที่ Rubygems สร้างขึ้น คุณสามารถตรวจสอบสิ่งนี้ได้ด้วย __FILE__ == $0 สำนวนที่ด้านบนของไฟล์ปฏิบัติการของคุณ:

if __FILE == $0
  # executing directly, probably in dev environment
  ENV['HOME'] = "somewhere else"
end

เมื่อเรียกไฟล์ของคุณโดยตรง สภาพแวดล้อมจะถูกแทนที่ เมื่อเรียก gem $0 ที่ติดตั้งไว้จะเป็นไฟล์ wrapper ดังนั้นจึงจะใช้สภาพแวดล้อมดั้งเดิม

วิธี "ปกติ" ในการทำเช่นนี้คือเพียงตั้งค่าสภาพแวดล้อมจากเชลล์ของคุณ เช่น ในทุบตี:

$ HOME='somewhere else' ./bin/the_executable

อันตรายที่นี่คือคุณอาจลืมตั้งค่าสภาพแวดล้อม ส่งผลให้คุณทิ้งไฟล์บางไฟล์ คุณสามารถหลีกเลี่ยงสิ่งนั้นได้โดยการตั้งค่าสภาพแวดล้อมใหม่สำหรับซีซันทั้งหมดของคุณ:

$ export HOME='somewhere else'
$ ./bin/the_executable

แต่สิ่งนี้อาจส่งผลต่อเครื่องมืออื่นๆ ที่ใช้ HOME จึงไม่แนะนำให้ใช้

คำแนะนำของฉันคือเลือกใช้ตัวเลือก Rakefile โดยมีตัวเลือก __FILE == $0 เป็นตัวเลือกที่สอง

person matt    schedule 26.05.2014
comment
ฉันกำลังดำเนินการตามแนวทางนี้ นอกจากนี้ ในบางกรณี ฉันกำลังเพิ่มการตรวจสอบไฟล์ที่จะมีอยู่ในสภาพแวดล้อมการพัฒนาเท่านั้น จะเป็น kill switch ได้อย่างมีประสิทธิภาพหากมีไฟล์นั้นอยู่และ ENV['HOME'] ยังไม่ได้รับการอัพเดต ถ้าฉันไม่กระตุ้นมันโดยไม่ได้ตั้งใจสักพัก ฉันจะลบมันออก แต่สำหรับตอนนี้ ฉันชอบไอเดียที่จะเพิ่มอีกชั้นในการปกป้องฉันจากตัวเองเมื่อฉันเรียนรู้ Ruby - person Alan W. Smith; 28.05.2014