У меня есть грабли задача, которая должна вставить значение в несколько баз данных.
Я хотел бы передать это значение в задачу rake из командной строки или из другой задачи rake.
Как я могу это сделать?
ruby
command-line
rake
command-line-arguments
Tilendor
источник
источник
Ответы:
параметры и зависимости должны быть внутри массивов:
затем
Рельсы ПРИМЕЧАНИЕ:
источник
rake thing:work[1, 2, 3]
как это не сработает, и вы получите ошибкуDon't know how to build task
rake thing:work'[1,2,3]'
rake thing:work\[1,2,3\]
или thisrake 'thing:work[1,2,3]'
:environment
символ из вашей задачи. У приложений rails есть: задача среды ...t
средстваtask
, почему бы не просто использовать вtask
качестве имени пар?Вы можете указать формальные аргументы в rake, добавив символьные аргументы к вызову задачи. Например:
Затем из командной строки:
Как показано во втором примере, если вы хотите использовать пробелы, кавычки вокруг целевого имени необходимы, чтобы оболочка не разделяла аргументы в пробеле.
Глядя на код в rake.rb , кажется, что rake не анализирует строки задач для извлечения аргументов для предварительных условий, поэтому вы не можете это сделать
task :t1 => "dep[1,2]"
. Единственный способ указать разные аргументы для предварительного условия - это явно вызвать его в зависимом действии задачи, как в:invoke_my_task
и:invoke_my_task_2
.Обратите внимание, что некоторые оболочки (например, zsh) требуют, чтобы вы выходили за скобки:
rake my_task\['arg1'\]
источник
WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
zsh: no matches found: ...
), так что вам нужно , чтобы избежать скобки:rake my_task\['arg1'\]
. От robots.thoughtbot.com/post/18129303042/…В дополнение к ответу по kch (я не нашел, как оставить комментарий к этому, извините):
Вам не нужно указывать переменные как
ENV
переменные передrake
командой. Вы можете просто установить их как обычные параметры командной строки:и получить доступ к ним из вашего файла rake как переменные ENV, например:
источник
p
означает?Если вы хотите передать именованные аргументы (например, со стандартными
OptionParser
), вы можете использовать что-то вроде этого:обратите внимание
--
, что это необходимо для обхода стандартных аргументов Rake. Должно работать с Rake 0.9.x , <= 10.3.x .Более новый Rake изменил свой синтаксический анализ
--
, и теперь вы должны убедиться, что он не переданOptionParser#parse
методу, например сparser.parse!(ARGV[2..-1])
exit
в конце убедитесь, что дополнительные аргументы не будут интерпретироваться как задача Rake.Также должен работать ярлык для аргументов:
Когда rake-скрипты выглядят так, возможно, пришло время искать другой инструмент, который позволил бы это просто из коробки.
источник
--option-names
. Мое единственное предложение было бы использовать ,exit
а не ,abort
какabort
оставит вас с кодом возврата 1 к оболочке. Если задача rake является частью скрипта более высокого уровня, более распространенным является предположение, что ненулевой выход - это ошибка определенного типа.--
? Как передачаrake
аргументов в реальную задачу или что-то еще? Нравитсяtask :my_task, :*args do |t, args|
или что?{username}
здесь. Где это используется? Почему его там нет-u {username}
? Приветствия10.4.1
и изменен10.4.2
. github.com/ruby/rake/commit/…Я нашел ответ на этих двух сайтах: Net Maniac и Aimred .
Вы должны иметь версию> 0.8 рейка, чтобы использовать эту технику
Обычное описание задачи с граблями таково:
Чтобы передать аргументы, сделайте три вещи:
Чтобы получить доступ к аргументам в сценарии, используйте args.arg_name
Чтобы вызвать эту задачу из командной строки, передайте ей аргументы в [] s
будет выводить
и если вы хотите вызвать эту задачу из другой задачи и передать ей аргументы, используйте invoke
тогда команда
будет выводить
Я не нашел способ передать аргументы как часть зависимости, так как следующий код ломается:
источник
'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
Другой часто используемый параметр - передавать переменные окружения. В вашем коде вы читаете их через
ENV['VAR']
, и можете передать их прямо передrake
командой, какисточник
rake blah -- --these --go --to --a-program
(обратите внимание,--
чтобы сообщить рейку, что его переключатели закончились), см. stackoverflow.com/questions/5086224/…На самом деле @Nick Desjardins ответил идеально. Но только для образования: вы можете использовать грязный подход: используя
ENV
аргументисточник
Я не мог понять, как передавать аргументы, а также окружение, пока не решил это:
И тогда я звоню так:
источник
источник
rake task_name[hello, world]
Я просто хотел иметь возможность бежать:
Просто, правда? (Нет!)
Рейк интерпретирует
arg1
иarg2
как задачи, и пытается их запустить. Таким образом, мы просто прерываем, прежде чем это произойдет.Возьми это, скобки!
Отказ от ответственности : я хотел быть в состоянии сделать это в довольно маленьком домашнем проекте. Не предназначен для использования в "реальном мире", так как вы теряете возможность связывать рейковые задачи (т.е.
rake task1 task2 task3
). ИМО не стоит. Просто используйте уродливыйrake task[arg1,arg2]
.источник
_, arg1, arg2 = ARGV
как первый аргумент был назван именем рейка. Ноexit
это ловкий трюк.rake task[arg1,arg2] && rake task2 && rake task3
Не уверен, что это менее уродливо, чемrake task[arg1,arg2] task2 task3
. Вероятно, менее эффективно, хотя._, *args = ARGV
идеально подходит для захвата всех последующих аргументов! Спасибо, куча!Я использую обычный аргумент ruby в файле rake:
затем я заглушаю задачи rake внизу файла (так как rake будет искать задачу по имени этого аргумента).
командная строка:
это кажется мне чище, чем var = foo ENV var и args [blah, blah2].
заглушка немного дрянная, но не слишком плохая, если у вас есть несколько сред, которые являются одноразовыми
источник
dup
в конце: db = ARGV [1] .dupdb = ARGV[1].dup unless ARGV[1].nil?
чтобы исключить исключение дублирования нуля.Способы передачи аргумента верны в ответе выше. Однако, чтобы выполнить задачу rake с аргументами, в более новой версии rails есть небольшая техническая составляющая.
Он будет работать с граблями "namespace: taskname ['arguments1']"
Обратите внимание на кавычки при запуске задачи из командной строки.
источник
Чтобы передать аргументы задаче по умолчанию, вы можете сделать что-то вроде этого. Например, скажите «версия» - ваш аргумент:
Тогда вы можете назвать это так:
или
или
Однако я не нашел способа избежать указания имени задачи (по умолчанию или сборка) при передаче аргументов. Хотелось бы услышать, если кто-нибудь знает способ.
источник
Мне нравится синтаксис querystring для передачи аргументов, особенно когда нужно передать много аргументов.
Пример:
«Строка запроса»:
Предупреждение: обратите внимание, что синтаксис есть
rake "mytask[foo=bar]"
и НЕrake mytask["foo=bar"]
При анализе внутри задачи rake
Rack::Utils.parse_nested_query
, мы получаемHash
:(Самое интересное, что вы можете передавать хэши и массивы, подробнее ниже)
Вот как это сделать:
Вот более расширенный пример, который я использую с Rails в своем геме delayed_job_active_record_threaded :
Анализируется так же, как и выше, с зависимостью от среды (для загрузки среды Rails)
Дает следующее в
options
источник
Если вы не можете вспомнить, какая позиция аргумента для чего, и вы хотите сделать что-то вроде хэга для аргумента ruby. Вы можете использовать один аргумент, чтобы передать строку, а затем пересмотреть эту строку в хэш опций.
И в командной строке вы получите.
источник
Большинство методов, описанных выше, не работают для меня, возможно, они устарели в более новых версиях. Актуальное руководство можно найти здесь: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks
Копирование и вставка из руководства здесь:
Вызвать это так
источник
Для запуска граблей с традиционным стилем аргументов:
А затем используйте:
Добавьте следующий патч Rake Gem:
источник
При передаче параметров лучше выбрать входной файл, это может быть файл json или что-то еще, что вам нужно, и оттуда прочитайте необходимую вам структуру данных и переменные, включая имя переменной, если это необходимо. Для чтения файла может иметь следующую структуру.
Пример JSON
выполнение
источник