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é.


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"

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

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'




1

Pourquoi ne pouvez-vous pas le faire comme ceci:

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

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;)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.