Rake Namespace Alias - PullRequest
       17

Rake Namespace Alias

5 голосов
/ 09 декабря 2011

Возможно ли псевдоним пространства имен в Rake?


Мне нравится, как вы можете создавать псевдонимы задач:

task :commit => :c

Хотелось бы иметь возможность делать что-то вроде этого:

namespace :git => :g

1 Ответ

6 голосов
/ 31 мая 2012

С

task :commit => :c

вы не определяете псевдоним, вы устанавливаете предварительное условие. Когда вы звоните :commit, предварительный запрос :c вызывается первым. Пока существует только одно предварительное условие и :commit не содержит собственного кода, оно может выглядеть как псевдоним , но это не так.

Зная это, вы можете ' псевдоним ' своего пространства имен, если вы определите задачу по умолчанию для вашего пространства имен и установите предварительное условие для этой задачи (и предварительное условие может снова задание по умолчанию для другого пространства имен).

Но я думаю, нет нужды совмещать пространства имен. Этого будет достаточно, если вы определите задачу по умолчанию для пространств имен и, возможно, ' alias ' эту задачу.


После прочтения вопроса у меня есть альтернативная идея, основанная на Существует ли «method_missing» для рейковых задач? :

require 'rake'

namespace :long_namespace do
  task :a do |tsk|
    puts "inside #{tsk.name}"
  end
end

rule "" do |tsk|
  aliastask = tsk.name.sub(/short:/, 'long_namespace:')
  Rake.application[aliastask].invoke 
end  

Rake.application['short:a'].invoke

Правило определяет task_missing -rule и пытается заменить пространство имен (в примере оно заменяет 'short' на 'long_namespace').

Недостаток: неопределенная задача не возвращает ошибок. Итак, вам нужна адаптированная версия:

require 'rake'

namespace :long_namespace do
  task :a do |tsk|
    puts "inside #{tsk.name}"
  end
end

rule "" do |tsk|
  aliastask = tsk.name.sub(/short:/, 'long_namespace:')
  if Rake.application.tasks.map{|tsk| tsk.name }.include?( aliastask )
    Rake.application[aliastask].invoke 
  else
    raise RuntimeError, "Don't know how to build task '#{tsk.name}'"
  end
end  

Rake.application['short:a'].invoke
Rake.application['short:undefined'].invoke

И более обобщенная версия с новым методом aliasnamespace для определения пространств имен псевдонимов:

require 'rake'
#Extend rake by aliases for namespaces
module Rake
  ALIASNAMESPACES = {}
end
def aliasnamespace(alias_ns, original_ns)
  Rake::ALIASNAMESPACES[alias_ns] = original_ns
end
rule "" do |tsk|
  undefined = true
  Rake::ALIASNAMESPACES.each{|aliasname, origin|
    aliastask = tsk.name.sub(/#{aliasname}:/, "#{origin}:")
    if Rake.application.tasks.map{|tsk| tsk.name }.include?( aliastask )
      Rake.application[aliastask].invoke 
      undefined = false
    end
  }
  raise RuntimeError, "Don't know how to build task '#{tsk.name}'" if undefined
end  

#And now the usage:
namespace :long_namespace do
  task :a do |tsk|
    puts "inside #{tsk.name}"
  end
end
aliasnamespace  :short, 'long_namespace'

Rake.application['short:a'].invoke
#~ Rake.application['short:undefined'].invoke
...