Mam zadanie Rails: czy powinienem używać script/runner czy rake?

Dla ad hoc rails mamy kilka alternatyw implementacyjnych, wśród których najważniejsze wydają się być:

script/runner some_useful_thing

I:

rake some:other_useful_thing

Którą opcję wybrać? Jeśli jest wyraźny faworyt, to kiedy, jeśli w ogóle, powinienem rozważyć użycie drugiego? Jeśli nigdy, to dlaczego przypuszczasz, że jest nadal obecny w ramach bez ostrzeżeń o deprecjacji?

Author: the Tin Man, 2009-02-26

8 answers

Różnica między nimi jest taka, że script/runner boots Rails, podczas gdy zadanie Rake nie działa, chyba że powiesz mu to, czyniąc zadanie zależnym od :environment, Jak to:

task :some_useful_task => :environment do
  # do some useful task
end

Ponieważ bootowanie szyn jest drogie, warto je pominąć, jeśli można tego uniknąć.

Poza tym są mniej więcej równoważne. Używam obu, ale ostatnio używam script/runner wykonując skrypt osobno bardziej.
 58
Author: Luke Francl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-26 18:49:07

FWIW wydaje się, że jest jakiś ruch od używania script runnera na rzecz rake ' a:

Update( 4/25/2009): polecam używanie zadań rake zamiast script/runner do powtarzających się zadań.

Również, jako za ten post możesz używać rake do powtarzających się zadań po prostu dobrze:

Gdybym chciał, żeby to działało co noc w mojej bazie produkcyjnej o północy, mógłbym napisać cronjob, który wygląda mniej więcej tak:

0 0 * * * cd / var / www/apps/ rails_app / & & /usr/local/bin / rake RAILS_ENV=production utils:send_expire_soon_emails

 10
Author: esilver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-09 22:31:49

Poprawione na podstawie komentarza 2 w dół. Daj im karmę!

FWIW-Rails 3.0 + zmienia sposób inicjalizacji systemu Rails w autonomicznym skrypcie.

require File.dirname(__FILE__) + '/config/environment'

Jak wspomniano powyżej można również zrobić:

rails runner script/<script name>

Lub umieścić cały kod w zadaniu Rake, ale mam dużo kodu z Rails 2; więc nie chciałem iść tą ścieżką od razu.

Każdy ma swoje wady i zalety.

 9
Author: Ben Walding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 22:45:14

Przekazywanie parametrów do zadania grabie to wrzód na tyłku, delikatnie mówiąc. Musisz albo uciekać się do zmiennych środowiskowych, albo bardzo hakerski system parametrów, który nie jest intuicyjny i ma wiele zastrzeżeń.

Jeśli Twoje zadanie musi obsługiwać argumenty linii poleceń z gracją, to pisanie skryptu jest dobrą drogą.

Luke Francl wspomina script/runner booting up Rails. To prawda. Ale jeśli nie chcesz uruchamiać rails to po prostu uruchom skrypt tak jak jest bez script/runner. Tak więc jedyną prawdziwą różnicą między skryptami a zadaniami rake ' a jest ich estetyka. Wybierz to, co ci pasuje.

Używam zadań rake do małych zadań(jedna lub dwie linie). Wszystko bardziej skomplikowane trafia do katalogu script/. Złamię tę zasadę, jeśli myślę, że inni programiści będą oczekiwać, że kod będzie żył w jednym miejscu nad drugim.

 9
Author: Alfred Fazio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 00:58:07

Jedną z rzeczy, które zrobiłem, to po prostu napisać normalne Skrypty ruby i umieścić je w katalogu script/maintenance.

Wszystko, co musisz zrobić, aby załadować rails i uzyskać dostęp do wszystkich modeli, itp., To umieścić require '../../config/environment.rb' na górze pliku, a następnie odejść.

 5
Author: Orion Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-26 19:35:44

W Rails 3.0+, config/environment.rb wymaga config/application.rb, który wymaga config/boot.rb.

Aby wczytać aplikację w Rails 3, Musisz tylko zażądać environment.rb
 3
Author: ppires,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-31 17:44:30

Dla jednorazowych poleceń skrypt / runner może być w porządku. W przypadku powtarzanych zadań prowizja jest łatwiejsza w dłuższej perspektywie i ma podsumowanie, jeśli zapomnisz, co robi.

 2
Author: Daniel Morris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-26 17:36:33

Odnoszę wrażenie, że skrypt / runner służy przede wszystkim do zadań okresowych. Np. praca crona, która działa:

SomeClass.update_from_web('http://www.sourcefordata.gov/')
 2
Author: jlc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-26 18:03:38