หากต้องการเปลี่ยนไดเร็กทอรีภายในสคริปต์ Ruby?


101

ฉันต้องการสร้างแอปพลิเคชั่นรางใหม่และเปิดเซิร์ฟเวอร์รางสำหรับแอปพลิเคชันนั้นทุกอย่างตั้งแต่สคริปต์ทับทิม

รหัสของฉันมีลักษณะดังนี้:

#!/usr/bin/env ruby
system "rails new my_app"
system "cd my_app"
system "rails server &"

อย่างไรก็ตามเมื่อเรียกใช้ "เซิร์ฟเวอร์ราง &" เส้นทางไม่ได้อยู่ในโฟลเดอร์ my_app แต่อยู่ในโฟลเดอร์หลัก

มีวิธีเปลี่ยนไดเร็กทอรีภายในสคริปต์เพื่อให้ฉันสามารถเรียกใช้ "เซิร์ฟเวอร์ราง" "คราดเกี่ยวกับ" และ "คราด db: migrate" สำหรับแอปพลิเคชันใหม่นั้นได้หรือไม่

การหลีกเลี่ยงเคล็ดลับทั้งหมดจะได้รับการชื่นชม


6
โปรดทราบว่าคำตอบที่ดีที่สุดไม่ใช่คำตอบที่ทำเครื่องหมายไว้ อ่านต่อไปที่ด้านล่างของหน้านี้
Zane

คำตอบ:


105

ใช้Dir.chdir:

Dir.chdir "my_app"

22
โปรดทราบว่าอาจมีผลข้างเคียงตลอดโปรแกรมที่เหลือของคุณ ดูคำตอบอื่น ๆ เพื่อหลีกเลี่ยงข้อบกพร่องที่อาจเกิดขึ้นจากสิ่งนี้
Leopd

นี่เป็นคำตอบที่ไม่ดี ช่วยแก้ปัญหาได้ แต่คุณอาจมีปัญหาในการเขียนโค้ดหลังจากนั้น โปรดพิจารณาเปลี่ยน "คำตอบที่ดีที่สุด" เป็นคำตอบอื่น (พร้อมการ
โหวต

367

อย่าฟังพวกเขาDir.chdir("dir")อาจจะทำสิ่งที่ผิด สิ่งที่คุณต้องการเกือบตลอดเวลาคือ จำกัด การเปลี่ยนแปลงเฉพาะบริบทโดยไม่ส่งผลกระทบต่อส่วนที่เหลือของโปรแกรมเช่นนี้:

#!/usr/bin/env ruby
system "rails new my_app"
Dir.chdir("my_app") do
  system "rails server &"
end
# back where we were, even with exception or whatever

ระมัดระวังการใช้บล็อกในแอปพลิเคชันแบบเธรดเช่นบล็อกที่ใช้ sidekiq Just and FYI :)
onetwopunch

@jryancanty ถ้าฉันสร้างเธรดและเปลี่ยนไดเร็กทอรีเหมือนในคำตอบนี้ "ผลข้างเคียง" คืออะไรถ้ามี? (ฉันจะไม่ใช้เพื่อนสนิทแค่Threadชั้นเรียน)
onebree

1
ฉันอยากรู้เหมือนกันว่าผลข้างเคียงคืออะไร (จากการใช้วิธีใดวิธีหนึ่ง) ถ้าคุณเปลี่ยนไดเร็กทอรีการทำงานคุณสามารถเปลี่ยนกลับได้เสมอใช่ไหม?
stevec

ไม่รู้ครั้งไหนทำไม่ได้ ... แค่ทำoriginal_directory = Dir::pwdแล้วค่อยจำตัวแปรทีหลังดังนี้Dir::chdir(original_directory)
Poyda

11

ระบบรองรับอาร์กิวเมนต์ chdir ที่อนุญาตให้คุณระบุไดเร็กทอรีการทำงาน:

system("echo Test; pwd", chdir: '/tmp')

เอาต์พุต '/ tmp'




1

ทำไมคุณถึงทำแบบนี้ไม่ได้:

#!/usr/bin/env ruby
system 'rails new myapp && cd myapp && rails server &'

1
เมื่อคำสั่งระบบล้มเหลวการวินิจฉัยสิ่งที่ผิดพลาดจะทำได้ยากขึ้น - แอปพลิเคชันรางล้มเหลวซีดีล้มเหลวหรือเซิร์ฟเวอร์รางล้มเหลวหรือไม่
ablarg

1

บรรทัดต่อไปนี้มีผลลัพธ์เดียวกัน:

puts Dir.chdir("/tmp") { IO.popen("ls -la") { |io| io.read } } 

puts IO.popen(["ls", "-la", "/tmp"]).read

puts IO.popen("ls -la /tmp").read

# drwxrwxrwt 25 root       root       16384 июля  23 01:17 .
# drwxr-xr-x 22 root       root        4096 июля  22 13:36 ..
# drwxrwxr-x 12 itsnikolay itsnikolay  4096 июля  19 17:14 app_template
# drwx------  2 itsnikolay itsnikolay  4096 июля  21 15:04 .com.google.Chrome.dThb8f
# drwx------  2 itsnikolay itsnikolay  4096 июля  18 20:55 .com.google.Chrome.FGDBGc

นอกจากนี้คุณยังสามารถเรียกใช้รางและสร้างแอปพลิเคชัน (ซึ่งจะมีประโยชน์ในการทดสอบ rspec และอื่น ๆ ):

IO.popen("cd /tmp/ && rails new test_app").read

และคุณสามารถเรียกใช้เซิร์ฟเวอร์ราง;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.