루비 스크립트 내에서 디렉토리를 변경하려면?


100

새로운 rails 응용 프로그램을 만들고 Ruby 스크립트에서 모든 것을 해당 응용 프로그램에 대한 rails 서버를 시작하고 싶습니다.

내 코드는 다음과 같습니다.

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

그러나 "rails server &"를 실행할 때 경로는 my_app 폴더가 아니라 상위 폴더에 있습니다.

새 애플리케이션에 대해 "rails server", "rake about"및 "rake db : migrate"를 실행할 수 있도록 스크립트 내부의 디렉토리를 변경하는 방법이 있습니까?

팁에 대한 모든 작업을 주시면 감사하겠습니다.


6
베스트 답변은 표시된 답변이 아닙니다. 이 페이지 하단을 계속 읽으십시오.

답변:


104

사용 Dir.chdir:

Dir.chdir "my_app"

22
이것은 프로그램의 나머지 부분에서 부작용이있을 수 있음을 명심하십시오. 이것으로 인한 잠재적 버그를 피하기 위해 다른 답변을 참조하십시오.
Leopd

이것은 잘못된 대답입니다. 그것은 문제를 해결하지만 그 이후에 코드에 문제가있을 수 있습니다. "우수 답변"을 다른 답변으로 변경하는 것을 고려하십시오 (더 많은
찬성 투표 포함

366

그들의 말을 듣지 마십시오 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 2010

@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
시스템 명령이 실패하면 무엇이 잘못되었는지 진단하기가 더 어려워집니다. Rails 앱이 실패 했습니까, CD가 실패 했습니까, 아니면 Rails 서버가 실패 했습니까?
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.