Pour changer de répertoire dans un script ruby?

100

Je veux créer une nouvelle application de rails et lancer le serveur de rails pour cette application, tout à partir d'un script ruby.

Mon code ressemble à ceci:

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

Cependant, lors de l'exécution de "rails server &", le chemin ne se trouve pas dans le dossier my_app, mais dans le dossier parent.

Existe-t-il un moyen de changer de répertoire dans un script afin que je puisse exécuter "rails server", "rake about" et "rake db: migrate" pour cette nouvelle application?

Tout travail autour des conseils serait apprécié.

never_had_a_name
la source
6
Notez que la meilleure réponse n'est pas celle marquée. Continuez à lire jusqu'au bas de cette page.
Zane

Réponses:

104

Utilisez Dir.chdir:

Dir.chdir "my_app"
Adrian
la source
22
Gardez à l'esprit que cela peut avoir des effets secondaires tout au long de votre programme. Voir d'autres réponses pour éviter les bugs potentiels.
Leopd
C'est une mauvaise réponse. Cela résout le problème, mais vous pouvez avoir un problème de code après cela. Veuillez envisager de remplacer la "meilleure réponse" par une autre (avec plus de votes positifs)
Ezh
366

Ne les écoutez pas, Dir.chdir("dir")fera probablement la mauvaise chose. Ce que vous voulez presque toujours, c'est limiter le changement à un contexte particulier, sans affecter le reste du programme comme ceci:

#!/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
taw
la source
Soyez très prudent en utilisant un bloc dans une application threadée telle que celle qui utilise sidekiq. Just and FYI :)
onetwopunch
@jryancanty Si je crée un fil de discussion et que je change de répertoire comme dans cette réponse, quels sont les «effets secondaires», le cas échéant? (Je n'utiliserai pas d'acolyte, juste de la Threadclasse)
onebree
1
Je suis également curieux de savoir quels sont les effets secondaires (de l'utilisation de l'une ou l'autre méthode). Si vous modifiez le répertoire de travail, vous pouvez toujours le modifier, non?
stevec
Je ne sais pas des moments où vous ne pouvez pas ... juste faire original_directory = Dir::pwd, puis rappelez-vous la variable plus tard comme ceci:Dir::chdir(original_directory)
Poyda
11

le système prend en charge: l'argument chdir qui vous permet de spécifier son répertoire de travail:

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

sorties '/ tmp'

wonderersz1
la source
3

Permet Dir.chdirde modifier le répertoire de travail d'un script.

mipadi
la source
1

Utilisez Dir.chdir ("[aString]")

utilisateur402987
la source
1

Pourquoi ne pouvez-vous pas le faire comme ceci:

#!/usr/bin/env ruby
system 'rails new myapp && cd myapp && rails server &'
Gaurav Manchanda
la source
1
Lorsque la commande système échoue, il sera plus difficile de diagnostiquer ce qui n'a pas fonctionné: l'application rails a-t-elle échoué, le CD a-t-il échoué ou le serveur rails a-t-il échoué?
ablarg
1

Les lignes suivantes ont le même résultat:

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

vous pouvez également exécuter des rails et créer une application (cela peut être utile dans les tests rspec, etc.):

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

et jamais vous pouvez exécuter un serveur de rails;)

Itsnikolay
la source