Rake,如何创建具有多个输入和一个输出的任务?

Rake, how to create a task with multiple inputs and one output?

我们有一个 rails 应用程序,我们使用 webpack 获取多个 javascript 文件并输出一个 javascript 文件。 运行 需要很长时间,我想为此创建一个 rake 任务。但作为新手,我需要一些帮助。

我想使用 rake 的构建系统,这样我就可以自动检查输入和输出 .js 文件之间的时间戳。因此,如果 any 输入文件比输出文件更新,它将执行 webpack。否则,如果输入文件的 none 比输出文件更新,则任务不执行任何操作。

在 MSBuild 中,这是小菜一碟,速度快如闪电。但是在 Ruby 我有点迷路了。

我猜它可能包括编写文件任务,循环遍历并使一个输出文件取决于输入。或者我应该使用这样的规则?

outputfile = "~/foo.js"
inputfiles = Dir["~/**/*.js"]

rule outputfile => inputfiles do
  bin/webpack bla bla bla
end

您可以使用 Rake::FileList 来实现这一点。像这样:

file "foo.js" => Rake::FileList["**/*.js"] do
  ...
end

而且,我不确定 rake 是否允许在路径中使用 ~,我认为需要完整路径。或者只使用 "#{Dir.home}/foo.js" 规则。

然后调用它:

rake ~/foo.js

当你有多个输出时:

task :build => Rake::FileList["config1.xml", "config2.xml"] do  
  # all that stuff is run only when the FileList above is changed
  touch 'foo1.js'
  touch 'foo2.js'
  sh "compile foo3.js"
  sh "do-anything-else foo4.js"
end

运行 它使用:

rake build