Rake命名空间别名

5

在Rake中是否可以为命名空间设置别名?


我喜欢如何为任务设置别名:

task :commit => :c

我希望能够做类似这样的事情:

namespace :git => :g

你一定应该接受 knut 的答案。 - Jerska
1个回答

6

With

task :commit => :c

你不需要定义别名,只需设置先决条件。 当你调用:commit时,先决条件:c会首先被调用。 只要有一个先决条件且:commit没有自己的代码,它就看起来像是一个别名,但实际上并不是。

知道了这一点,如果你为命名空间定义了一个默认任务并为该任务设置了一个先决条件(而该先决条件可能是另一个命名空间的默认任务),那么你可以'别名'你的命名空间。

但我认为,没有必要给命名空间取别名。如果你为命名空间定义了一个默认任务,或许'别名'那个任务就足够了。


再次阅读问题后,我有一个基于Rake任务是否有“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规则,并试图替换命名空间(在本例中,它将“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

2
命名空间别名的一个简单示例。我在不使用Rails的情况下使用AR,并希望将一些Rails命令重新创建为Rake任务。拥有rake generate:migrationrake g:migration会很棒。 - Jerska
2
@Jerska,你让我重新思考了这个问题:我添加了第二个答案。 - knut
哇,真是太棒了的回答!谢谢!愿你的名字受到尊崇,愿你的国度早日来临等等! - Jerska

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接