Mam plik Rakefile, który kompiluje projekt na dwa sposoby, zgodnie ze zmienną globalną $build_type
, którą może być :debug
lub :release
(wyniki znajdują się w osobnych katalogach):
task :build => [:some_other_tasks] do
end
Chcę utworzyć zadanie, które po kolei kompiluje projekt z obiema konfiguracjami, mniej więcej tak:
task :build_all do
[ :debug, :release ].each do |t|
$build_type = t
# call task :build with all the tasks it depends on (?)
end
end
Czy istnieje sposób na wywołanie zadania tak, jakby to była metoda? Lub jak mogę osiągnąć coś podobnego?
Rake::Task["build"].invoke
może być o wiele bardziej wydajne niż używanie,system rake build
ponieważ nie musi tworzyć nowego wątku i ładować środowiska Rails, cosystem rake build
trzeba zrobić.Odpowiedzi:
Jeśli potrzebujesz, aby zadanie zachowywało się jak metoda, co powiesz na użycie rzeczywistej metody?
Jeśli wolisz trzymać się
rake
idiomów, oto twoje możliwości, zebrane na podstawie wcześniejszych odpowiedzi:To zawsze wykonuje zadanie, ale nie wykonuje jego zależności:
Ten wykonuje zależności, ale wykonuje zadanie tylko wtedy, gdy nie zostało jeszcze wywołane:
To najpierw resetuje stan już wywołanego zadania, umożliwiając jego ponowne wykonanie, zależności i wszystkie:
Należy zauważyć, że wywołane już zależności nie są automatycznie ponownie uruchamiane, chyba że zostaną ponownie włączone. W Rake> = 10.3.2 możesz również użyć tych opcji, aby je ponownie włączyć:
źródło
Rake::Task['db:reset'].invoke
Rake::Task['with:args'].invoke("pizza")
ENV['VERSION'] = '20110408170816'; Rake::Task['db:migrate'].invoke
zobacz tutaj, aby uzyskać więcej wyjaśnień.#reenable()
że nie włącza ponownie wymagań wstępnych i potrzebowałem tego. Ten dodatek do Rake (> = 10.3.2)#all_prerequisite_tasks()
spowoduje iterację wszystkich zadań, w tym wstępnych wymagań wstępnych. Tak więcRake::Task[task].all_prerequisite_tasks.each &:reenable
rake db:reset db:migrate
przykład w wierszu poleceń ). Czy możesz zrobić coś takiego:Rake::Task["db:reset", "db:migrate"].invoke
na przykład:
źródło
To powinno cię załatwić, sam potrzebowałem tego samego.
źródło
źródło
źródło
Jeśli chcesz, aby każde zadanie działało bez względu na awarie, możesz zrobić coś takiego:
źródło
Sugerowałbym, aby nie tworzyć ogólnych zadań debugowania i zwalniania, jeśli projekt jest tak naprawdę kompilowany, co powoduje powstanie plików. Powinieneś przejść do zadań związanych z plikami, co jest całkiem wykonalne w twoim przykładzie, gdy stwierdzasz, że twoje wyjście trafia do różnych katalogów. Powiedz, że twój projekt po prostu kompiluje plik test.c do out / debug / test.out i out / release / test.out za pomocą gcc, możesz skonfigurować swój projekt w następujący sposób:
Tej konfiguracji można użyć w następujący sposób:
Robi to nieco więcej, o co prosiłem, ale pokazuje moje punkty:
źródło