Псевдоним имени задачи в Rake - PullRequest
20 голосов
/ 05 октября 2011

Когда мне нужно присвоить псевдониму какой-либо задачи, как мне это сделать?

Например, как включить имя задачи:

rake db:table
rake db:create
rake db:schema
rake db:migration

до:

rake db:t
rake db:c
rake db:s
rake db:m

Редактирование после получения ответа:

def alias_task(tasks)
    tasks.each do |new_name, old_name|
        task new_name, [*Rake.application[old_name].arg_names] => [old_name]
    end
end

alias_task [
    [:ds, :db_schema],
    [:dc, :db_create],
    [:dr, :db_remove]
]

Ответы [ 2 ]

37 голосов
/ 05 октября 2011

Зачем вам нужен псевдоним? Вы можете ввести новую задачу без кода, но с предварительным условием для оригинальной задачи.

namespace :db do
  task :table do
    puts "table"
  end
  #kind of alias
  task :t => :table
end

Это можно комбинировать с параметрами:

require 'rake'
desc 'My original task'
task :original_task, [:par1, :par2] do |t, args|
  puts "#{t}: #{args.inspect}"
end

#Alias task.
#Parameters are send to prerequisites, if the keys are identic.
task :alias_task, [:par1, :par2] => :original_task

Чтобы избежать поиска имен параметров, вы можете прочитать параметры с помощью arg_names:

#You can get the parameters of the original 
task :alias_task2, *Rake.application[:original_task].arg_names, :needs => :original_task

Объедините его с define_alias_task -методом:

def define_alias_task(alias_task, original)
  desc "Alias #{original}"
  task alias_task, *Rake.application[original].arg_names, :needs => original
end
define_alias_task(:alias_task3, :original_task)

Протестировано с ruby ​​1.9.1 и rake-0.8.7.

Хм, ну, я вижу, это более или менее точно такое же решение, которое RyanTM уже опубликовал несколько часов назад.

5 голосов
/ 05 октября 2011

Вот код, который кто-то написал для этого: https://gist.github.com/232966

def alias_task(name, old_name)
  t = Rake::Task[old_name]
  desc t.full_comment if t.full_comment
  task name, *t.arg_names do |_, args|
    # values_at is broken on Rake::TaskArguments
    args = t.arg_names.map { |a| args[a] }
    t.invoke(args)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...