Para mudar de diretório dentro de um script ruby?


100

Quero criar um novo aplicativo Rails e iniciar o servidor Rails para esse aplicativo, tudo em um script ruby.

Meu código é parecido com este:

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

No entanto, ao executar "rails server &", o caminho não está na pasta my_app, mas na pasta pai.

Existe uma maneira de alterar o diretório dentro de um script para que eu possa executar "servidor rails", "rake about" e "rake db: migrate" para esse novo aplicativo?

Todas as dicas úteis seriam apreciadas.


6
Observe que a melhor resposta não é aquela marcada. Continue lendo até o final desta página.
Zane

Respostas:


104

Use Dir.chdir:

Dir.chdir "my_app"

22
Lembre-se de que isso pode ter efeitos colaterais durante o restante do programa. Veja outras respostas para evitar possíveis bugs.
Leopd

Esta é uma resposta ruim. Ele resolve o problema, mas você pode ter um problema no código depois dele. Considere mudar a "melhor resposta" para outra (com mais
votos positivos

366

Não Dir.chdir("dir")dê ouvidos a eles, provavelmente fará a coisa errada. O que você quase sempre deseja é limitar a mudança a um contexto particular, sem afetar o resto do programa como este:

#!/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

Tenha muito cuidado ao usar um bloco em um aplicativo encadeado, como aquele que usa sidekiq. Just and FYI :)
onetwopunch

@jryancanty Se eu criar um tópico e mudar de diretório como nesta resposta, quais são os "efeitos colaterais", se houver? (Não vou usar sidekick, apenas Threadaula)
onebree

1
Também estou curioso para saber quais são os efeitos colaterais (de usar um dos métodos). Se você alterar o diretório de trabalho, sempre poderá alterá-lo de volta, certo?
stevec

Não sei se você não pode ... apenas fazer original_directory = Dir::pwd, então relembrar a variável mais tarde assim:Dir::chdir(original_directory)
Poyda

11

sistema suporta: argumento chdir que permite especificar seu diretório de trabalho:

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

saídas '/ tmp'




1

Por que você não pode simplesmente fazer assim:

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

1
Quando o comando do sistema falhar, será mais difícil diagnosticar o que deu errado - o aplicativo rails falhou, o cd falhou ou o servidor rails falhou?
ablarg

1

As seguintes linhas têm a mesma saída:

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

também você pode executar rails e criar um aplicativo (isso pode ser útil em testes rspec e etc.):

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

e sempre você pode executar um servidor Rails;)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.