Mam zadanie prowizji, które musi wstawić wartość do wielu baz danych.
Chciałbym przekazać tę wartość do zadania prowizji z wiersza poleceń lub innego zadania prowizji.
W jaki sposób mogę to zrobić?
ruby
command-line
rake
command-line-arguments
Tilendor
źródło
źródło
Odpowiedzi:
opcje i zależności muszą znajdować się wewnątrz tablic:
Następnie
UWAGA SZYNY:
źródło
rake thing:work[1, 2, 3]
ponieważ to nie zadziała, a otrzymasz błądDon't know how to build task
rake thing:work'[1,2,3]'
rake thing:work\[1,2,3\]
lub tenrake 'thing:work[1,2,3]'
:environment
symbol ze swojego zadania. aplikacje szynowe mają: zadanie środowiskowe ...t
oznaczatask
, dlaczego nie użyć po prostutask
nazwy param?Możesz określić formalne argumenty w rake, dodając argumenty symboli do wywołania zadania. Na przykład:
Następnie z wiersza poleceń:
Jak pokazano w drugim przykładzie, jeśli chcesz używać spacji, cudzysłowy wokół nazwy celu są niezbędne, aby powłoka nie dzieliła argumentów w przestrzeni.
Patrząc na kod w rake.rb , okazuje się, że rake nie analizuje ciągów zadań w celu wyodrębnienia argumentów dotyczących wymagań wstępnych, więc nie możesz tego zrobić
task :t1 => "dep[1,2]"
. Jedynym sposobem na określenie różnych argumentów dla warunku wstępnego byłoby jawne wywołanie go w ramach zależnej akcji zadania, jak w:invoke_my_task
i:invoke_my_task_2
.Zauważ, że niektóre powłoki (jak zsh) wymagają ucieczki od nawiasów:
rake my_task\['arg1'\]
źródło
WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
zsh: no matches found: ...
), więc trzeba się uciec wsporniki:rake my_task\['arg1'\]
. Z robots.thoughtbot.com/post/18129303042/…Oprócz odpowiedzi autorstwa kcha (przepraszam, nie znalazłem sposobu na pozostawienie komentarza):
Nie musisz określać zmiennych jako
ENV
zmiennych przedrake
poleceniem. Możesz po prostu ustawić je jako zwykłe parametry wiersza poleceń:i uzyskaj dostęp do tych z pliku rake jako zmienne ENV takie jak:
źródło
p
oznacza?Jeśli chcesz przekazać nazwane argumenty (np. Ze standardem
OptionParser
), możesz użyć czegoś takiego:zwróć uwagę
--
, że jest to konieczne do ominięcia standardowych argumentów Rake. Powinien pracować z prowizji 0.9.x , <= 10.3.x .Nowszy Rake zmienił swoje parsowanie
--
, a teraz musisz się upewnić, że nie został przekazany doOptionParser#parse
metody, na przykład zparser.parse!(ARGV[2..-1])
exit
na końcu upewni się, że dodatkowe argumenty nie będą interpretowane jako zadanie Rake.Skrót do argumentów powinien również działać:
Kiedy skrypty rake wyglądają tak, być może nadszedł czas, aby poszukać innego narzędzia, które pozwoliłoby na to po wyjęciu z pudełka.
źródło
--option-names
. Moją jedyną propozycją byłoby użycieexit
zamiast,abort
ponieważabort
pozostawi ci kod powrotu 1 do powłoki. Jeśli zadanie prowizji jest częścią skryptu wyższego poziomu, częściej przyjmuje się, że niezerowe wyjście jest rodzajem błędu.--
? Jak przekazywanierake
argumentów do faktycznego zadania czy coś? Lubisztask :my_task, :*args do |t, args|
czy coś?{username}
tu jest. Gdzie jest używany? Dlaczego tego nie ma-u {username}
? Na zdrowie10.4.1
i przywrócony10.4.2
. github.com/ruby/rake/commit/…Znalazłem odpowiedź z tych dwóch stron internetowych: Net Maniac i Aimred .
Aby skorzystać z tej techniki, musisz mieć wersję> 0,8 rake'u
Normalny opis zadania rake jest następujący:
Aby przekazać argumenty, wykonaj trzy czynności:
Aby uzyskać dostęp do argumentów w skrypcie, użyj args.arg_name
Aby wywołać to zadanie z wiersza poleceń, przekaż mu argumenty w [] s
wyjdzie
a jeśli chcesz wywołać to zadanie z innego zadania i przekazać mu argumenty, użyj invoke
następnie polecenie
wyjdzie
Nie znalazłem sposobu na przekazywanie argumentów jako części zależności, ponieważ następujący kod się psuje:
źródło
'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
Inną często stosowaną opcją jest przekazywanie zmiennych środowiskowych. W swoim kodzie czytasz je przez
ENV['VAR']
i możesz przekazać je tuż przedrake
poleceniem, na przykładźródło
rake blah -- --these --go --to --a-program
(zwróć uwagę na--
prowizję, że jej przełączniki się zakończyły), patrz stackoverflow.com/questions/5086224/…Właściwie @Nick Desjardins odpowiedział doskonale. Ale tylko dla edukacji: możesz zastosować brudne podejście: używając
ENV
argumentówźródło
Nie mogłem wymyślić, jak przekazywać argumenty, a także: środowisko, dopóki nie opracowałem tego:
A potem dzwonię w ten sposób:
źródło
źródło
rake task_name[hello, world]
Chciałem tylko móc biegać:
Proste, prawda? (Nie!)
Rake interpretuje
arg1
iarg2
jako zadania, i próbuje je uruchomić. Więc po prostu przerywamy, zanim to nastąpi.Weź to, nawiasy!
Oświadczenie : Chciałem móc to zrobić w dość małym projekcie dla zwierząt. Nie jest przeznaczony do użycia w „świecie rzeczywistym”, ponieważ tracisz możliwość łączenia zadań rake (tj
rake task1 task2 task3
.). IMO nie jest tego warte. Po prostu użyj brzydkiegorake task[arg1,arg2]
.źródło
_, arg1, arg2 = ARGV
ponieważ pierwszy argument był nazwą zadania rake. Aleexit
to fajna sztuczka.rake task[arg1,arg2] && rake task2 && rake task3
Nie jestem pewien, czy to mniej brzydkie niżrake task[arg1,arg2] task2 task3
. Prawdopodobnie mniej wydajny._, *args = ARGV
jest idealny do przechwytywania wszystkich kolejnych argumentów! Dzięki stosy!Używam zwykłego argumentu ruby w pliku rake:
następnie usuwam zadania rake na dole pliku (ponieważ rake wyszuka zadanie na podstawie nazwy tego argumentu).
wiersz poleceń:
wydaje mi się to czystsze niż var = foo ENV var i zadanie argumentuje [bla, bla2] rozwiązania.
odgałęzienie jest trochę szarpane, ale nie jest takie złe, jeśli masz tylko kilka środowisk, które są jednorazową konfiguracją
źródło
dup
na końcu: db = ARGV [1] .dupdb = ARGV[1].dup unless ARGV[1].nil?
aby uniknąć wyjątku kopiowania zera.Sposoby przekazywania argumentu są poprawne w powyższej odpowiedzi. Jednak aby uruchomić zadanie rake z argumentami, w nowszej wersji szyn występuje niewielka technika
Będzie działał z prowizją „namespace: taskname ['argument1']"
Zwróć uwagę na odwrócone cudzysłowy podczas uruchamiania zadania z wiersza poleceń.
źródło
Aby przekazać argumenty do domyślnego zadania, możesz zrobić coś takiego. Na przykład powiedz „wersja” to twój argument:
Możesz to tak nazwać:
lub
lub
Jednak nie znalazłem sposobu, aby uniknąć podania nazwy zadania (domyślnej lub kompilacji) podczas przekazywania argumentów. Chciałbym usłyszeć, jeśli ktoś zna sposób.
źródło
Podoba mi się składnia „querystring” do przekazywania argumentów, szczególnie gdy jest wiele argumentów do przekazania.
Przykład:
„Querystring” to:
Ostrzeżenie: zauważ, że składnia jest
rake "mytask[foo=bar]"
i NIErake mytask["foo=bar"]
Po przeanalizowaniu za pomocą zadania prowizji
Rack::Utils.parse_nested_query
otrzymujemyHash
:(Fajne jest to, że możesz przekazywać skróty i tablice, więcej poniżej)
Oto jak to osiągnąć:
Oto bardziej rozbudowany przykład, którego używam z Railsami w moim klejnocie z opóźnieniem_obrotu_aktywnego_rejestrowania_recordu :
Przetwarzane w taki sam sposób jak powyżej, z zależnością środowiska (w celu załadowania środowiska Rails)
Daje następujące w
options
źródło
Jeśli nie możesz zaprzątać sobie głowy zapamiętywaniem, która pozycja argumentu jest dla czego, i chcesz zrobić coś w rodzaju skrótu argumentu ruby. Możesz użyć jednego argumentu, aby przekazać ciąg, a następnie ponownie wyrejestruj ten ciąg do skrótu opcji.
I w wierszu poleceń pojawi się.
źródło
Większość opisanych powyżej metod nie działała dla mnie, być może są one przestarzałe w nowszych wersjach. Aktualny przewodnik można znaleźć tutaj: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks
Skopiuj i wklej ans z przewodnika jest tutaj:
Wywołaj to w ten sposób
źródło
Aby uruchomić zadania prowizji z tradycyjnym stylem argumentów:
A następnie użyj:
Dodaj następującą łatkę klejnotu prowizji:
źródło
Podczas przekazywania parametrów lepszym rozwiązaniem jest plik wejściowy, czy może to być excel json lub cokolwiek potrzebujesz, a stamtąd odczytaj potrzebną strukturę danych i zmienne, w tym nazwę zmiennej. Aby odczytać plik, może mieć następującą strukturę.
Przykład json
Wykonanie
źródło