如何在不同的rake任务中使用相同名称的辅助函数?以下代码不起作用:
# bar.rake
namespace :bar do
desc 'bar'
task :bar => :environment do
bar
end
def bar
puts "bar bar"
end
end
# foo.rake
namespace :foo do
desc 'bar'
task :bar => :environment do
bar
end
def bar
puts "foo bar"
end
end
(错误)结果是:
$ rake bar:bar
foo bar
那是因为rake的命名空间不像ruby的模块那样工作,所以第二个任务中的bar函数重新定义了第一个任务的bar函数。
那么在rake任务中使用本地帮助函数有什么好的解决方案呢?
答案 0 :(得分:2)
您可以将整个定义包装在模块中,但需要使用Rake DSL扩展它:
# bar.rake
Module.new do
extend Rake::DSL
namespace :bar do
desc 'bar'
task :bar => :environment do
bar
end
def self.bar
puts "bar bar"
end
end
# foo.rake
Module.new do
extend Rake::DSL
namespace :foo do
desc 'bar'
task :bar => :environment do
bar
end
def self.bar
puts "foo bar"
end
end
end
答案 1 :(得分:2)
拥有本地帮助函数的另一种方法是使用本地辅助函数:)
namespace :bar do
desc 'bar'
task :bar => :environment do
helper = -> {
puts 'bar bar'
}
helper.call
end
end
答案 2 :(得分:1)
更多的样式首选项,但通常我将使用静态方法创建namespace :bar do
task :bar => :environment do
StaticTask.fetch
end
end
# OR
namespace :foo do
task :bar => :environment do
idea = AnotherIdea.new
idea.fetch
end
end
类(或者如果需要管理某个状态,则构建实例)并在rake任务中使用它们。这样,这些方法也很容易测试。在你的情况下:
require
我喜欢亲自关注的更多模式,但它创造了一个很好的分离任务之间的关注点。
(对于 con.Open();
OleDbCommand Cmd = new OleCommand("SELECT * FROM Article", con);
DataSet Ds = new DataSet();
OleDbDataAdapter dscmd = new OleDbDataAdapter(Cmd);
dscmd.Fill(Ds, "Article");
CrystalReport7 objRpt7 = new CrystalReport7();
objRpt7.SetDataSource(Ds);
crystalReportViewer7.ReportSource = objRpt7;
crystalReportViewer7.Refresh();
con.Close();
,无论你带哪个班级,这都是至关重要的)