Я бы хотел, чтобы rake выбирал между двумя задачами, в зависимости от аргумента командной строки.
Файл rakefile "characters.rake" будет выглядеть примерно так:
#usage: rake -f characters.rake characters=letters_or_numbers --trace
ENV["characters"] ? @characters = ENV["characters"] : nil
LETTERS=["A", "B", "C"]
NUMBERS=["1", "2", "3"]
directory "characters"
desc "Create letter or number files"
task :create_character_files => ["characters"] do
my_ch="#{@characters}"
case my_ch
when "letters"
LETTERS.each do |letter|
file "#{letter}.txt" do
sh "echo #{letter} > characters/#{letter}.txt"
end
end
when "numbers"
NUMBERS.each do |number|
file "#{number}.txt" do
sh "echo #{number} > characters/#{number}.txt"
end
end
else
puts "Neither letters nor numbers"
end
end
desc "default"
task :default => :create_character_files
Идея заключалась бы в том, что если бы я назвал его с помощью: rake -f characters.rake characters=numbers --trace
, я бы получил три файла, созданные в каталоге с именами "символов" и именованными 1.txt
, 2.txt
и 3.txt
соответственно.
characters/1.txt
1
characters/2.txt
2
characters/3.txt
3
Точно так же, если бы я запустил rake -f characters.rake characters=letters --trace
, я бы получил три файла:
characters/A.txt
A
characters/B.txt
B
characters/C.txt
C
Обычно, когда у меня есть отдельные задачи, они бы выглядели так:
ENV["characters"] ? @characters = ENV["characters"] : nil
LETTERS=["A", "B", "C"]
directory "characters"
LETTERS.each do |letter|
file "#{letter}.txt => ["characters"] do
sh "echo #{letter} > characters/#{letter}.txt"
end
end
desc "Create letter files"
task :create_character_files => LETTERS.map{|x| "characters/" + x + ".txt"} do
puts "letter files created"
end
desc "default"
task :default => :create_character_files
Это будет работать.
Однако в моем более сложном «случае» мой сценарий либо не работает, либо ничего не делает, независимо от того, куда я добавляю зависимости самих файлов.
Любая помощь приветствуется.