Ruby on Rails: Comment puis-je spécifier un environnement de script runner

J’utilise un script shell pour exécuter des scripts runner dans mon application Ruby on Rails. Je dois l’exécuter sur la firebase database de production, mais les suivantes:

#!/bin/bash /usr/bin/ruby RAILS_ENV=production ../script/runner ../lib/tasks.rb 

donne une erreur:

 /usr/bin/ruby: No such file or directory -- RAILS_ENV=production (LoadError) 

J’ai essayé de le forcer dans config / environment.rb

 ENV['RAILS_ENV'] ||= 'production' 

ou même

 ENV['RAILS_ENV'] = 'production' 

mais même avec cela, il fonctionne toujours dans l’environnement de développement.

Mise à jour: je peux forcer les scripts à se connecter à la bonne firebase database en éditant le fichier config / database.yml, mais je me demande quelle est la bonne façon de le faire.

L’aide sur la ligne de commande pour script / runner vous donne votre réponse.

 script/runner -e production Model.method 

Si c’est votre commande, l’ordre de vos arguments est votre plus gros problème.

 /usr/bin/ruby RAILS_ENV=production ../script/runner ../lib/tasks.rb 

Est différent de.

 /usr/bin/ruby ../script/runner ../lib/tasks.rb RAILS_ENV=production 

Le deuxième exemple est la recherche du fichier, le premier consiste à définir une variable d’exécution pendant que Ruby l’interprète comme le fichier à exécuter.

Si vous refaites votre script comme ceci:

 #!/bin/bash RAILS_ENV=production /usr/bin/ruby ../script/runner ../lib/tasks.rb 

… cela le fera durer toute la vie du script. Pour le faire coller pendant la durée de la session du shell, changez-le en

 #!/bin/bash export RAILS_ENV=production /usr/bin/ruby ../script/runner ../lib/tasks.rb 

Vous pouvez définir la variable d’environnement comme ceci:

 RAILS_ENV=production /usr/bin/ruby ../script/runner ../lib/tasks.rb 
 RAILS_ENV=production script/rails runner 'user = User.find(:first, :conditions => {:admin => true}) ; user.password, user.password_confirmation = "mypasswd"; user.save!' 

ça a fonctionné pour moi