【问题标题】:Rake, how to create a task with multiple inputs and one output?Rake,如何创建具有多个输入和一个输出的任务?
【发布时间】:2015-11-20 20:49:12
【问题描述】:

我们有一个 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

【问题讨论】:

    标签: ruby rake


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 问题:如何让另一个任务依赖它?像这样?任务 :foo => 'foo.js' do ..... end
    • 我认为是这样的:task build: ["foo.js"] 或者如果这是关于另一个文件:file "somethingelse.js" => "foo.js"实际上你的 task :foo 应该可以正常工作
    • 好的,如果我有多个输出文件呢?我该怎么做?
    • 你可以试试这样的:task update_lots_of_files: Rake::FileList[...]。仅当文件列表更改时才会调用该任务,并且在任务中您可以根据需要更新任意数量的文件。
    • 那么,不需要指定输出文件了吗?如果有怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 2020-07-25
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多