Capistrano benutzerdefinierten task schlägt fehl, weil "Schienen erfordert RubyGems >= 1.3.2"
-
05-07-2019 - |
Frage
Meine benutzerdefinierte capistrano-Aufgabe "app:Beispiel" schlägt mit der folgenden Fehlermeldung:
mnylen ilmo-on-rails $ cap app:sample
* executing `app:sample'
* executing "export RAILS_ENV=production; cd /home/mnylen/ilmo-on-rails/current; ruby script/coursegen 10"
servers: ["rails.cs.helsinki.fi"]
* establishing connection to gateway `melkinpaasi.cs.helsinki.fi'
* Creating gateway using melkinpaasi.cs.helsinki.fi
* establishing connection to `rails.cs.helsinki.fi' via gateway
Password:
[rails.cs.helsinki.fi] executing command
*** [err :: rails.cs.helsinki.fi] Rails requires RubyGems >= 1.3.2. Please install RubyGems and try again: http://rubygems.rubyforge.org
command finished
failed: "sh -c 'export RAILS_ENV=production; cd /home/mnylen/ilmo-on-rails/current; ruby script/coursegen 10'" on rails.cs.helsinki.fi
Bin ich etwas fehlt oder etwas falsch machen?Die Aufgabe ist:
namespace :app do
desc "Run sample data on production2
task :sample do
run "export RAILS_ENV=production; cd #{current_path}; ruby script/coursegen 10"
end
end
Wenn ich führen Sie den gleichen Befehl von den tatsächlichen server, it works fine.
Lösung 2
Okay, Problem gelöst.
Das problem war, dass es zwei Ruby-Installationen auf dem Produktions-server.
Die .Profil - Datei unter meinem home-Verzeichnis auf dem Produktions-server legen Sie die PFAD - environment-variable zeigt auf die richtige Ruby-version.
laufen Befehl, so scheint es, nicht die Quelle der .Profil Datei-und so läuft ruby script/coursegen 10 in der Aufgabe verwendet, die falsche Ruby version, das war der Grund für die seltsame Fehlermeldung über RubyGems version.Dies erklärt auch, warum es funktionierte, wenn Sie manuell ausgeführt, den Befehl von Produktions-Servern shell.
Meine Lösung war die Verwendung vollständigen Pfad zum Ruby-executable in meinem task ausführen, wie diese:
run "export RAILS_ENV=production; cd #{current_path}; /opt/ruby-enterprise-1.8.7-2009.10/bin/ruby script/coursegen 10"
Natürlich, dies ist nicht hübsch, aber es funktioniert.Wenn jemand keine schöneren Lösungen, wäre ich mehr als froh, verwenden Sie diese stattdessen.:)
Andere Tipps
Cap wird den Remote-Befehl als ein unerwartetes Benutzer ausgeführt wird - und dass Benutzer nicht über den richtigen Pfad und Juwel in Ruby. Überprüfen Sie die Einstellungen in Ihrem Rezept für :user
und :use_sudo
. Lesen Sie sorgfältig die Kappe Ausgabe zu sehen, welche Benutzer verbunden wird. Ich sehe Sie einen :gateway
verwenden; es können zwei Benutzer in diesem Fall sein. Ein an das Gateway zu verbinden, und eine andere, um tatsächlich laufen Befehle auf dem Zielserver.
Scheint, wie Sie Ihre RubyGems auf dem Remote-Server aktualisieren sollen.