Rake命名空间别名

Chr*_*son 5 rake alias namespaces

是否可以在Rake中为命名空间添加别名?


我喜欢你可以如何别名任务:

task :commit => :c
Run Code Online (Sandbox Code Playgroud)

很想能够做到这样的事情:

namespace :git => :g
Run Code Online (Sandbox Code Playgroud)

knu*_*nut 6

task :commit => :c
Run Code Online (Sandbox Code Playgroud)

如果没有定义别名,则需要设置先决条件.当您调用:commitprerequsite 时,首先调用:c.只要只有一个prerequsite并且:commit不包含自己的代码,它可能看起来像一个别名,但事实并非如此.

知道了,你可以" 别名 "命名空间,如果你定义一个默认任务您的命名空间和设置的先决条件这项任务(和先决条件可能会再次另一个命名空间的默认任务).

但我认为,不需要别名命名空间.如果您为namepsaces定义默认任务并且可能为该任务定义" 别名 " 就足够了.


在再次阅读这个问题之后,我有另一种想法,基于是否有针对佣金任务的"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
Run Code Online (Sandbox Code Playgroud)

该规则定义了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
Run Code Online (Sandbox Code Playgroud)

还有一个更通用的版本,带有一个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
Run Code Online (Sandbox Code Playgroud)

  • "需要"命名空间别名的简单示例.我正在使用没有Rails的AR,我想重新创建一些Rails命令作为Rake任务.有了'rake generate:migration`和`rake g:migration`会很棒. (2认同)
  • @Jerska你让我再次思考这个问题:我添加了第二个答案. (2认同)