【问题标题】:rake invokes a task twice with -mrake 使用 -m 调用任务两次
【发布时间】:2014-04-19 05:57:33
【问题描述】:

我正在构建一个具有菱形依赖项的 Rakefile,

  A
 / \
B   C
 \ /
  D

Rakefile 如下。

task :default => :a

task :a => [:b, :c] do |t|
  puts "#{t.name}"
end

task :b => :d do |t|
  puts "#{t.name}"
end

task :c => :d do |t|
  puts "#{t.name}"
end

task :d do |t|
  puts "#{t.name}"
end

问题是task :d 使用多任务选项调用了两次。

$ rake -m
d
d
c
b
a

task :d 是一个任务,应该在我每次运行 rake 时调用,但在每次构建中只调用一次。

我考虑过使用 filetask,但由于它实际上是一个向远程服务器发送信号的任务,因此该任务没有生成文件。

我也尝试了以下时间戳方法,但没有任何改变。

def (task(:d)).timestamp
  if @timestamp
    @timestamp
  else
    @timestamp = Time.now
  end
end

我应该怎么做才能让它工作?

【问题讨论】:

    标签: ruby build rake rakefile


    【解决方案1】:

    由于 rake 是普通的 ruby​​,您可以使用所有普通的 ruby​​ 技术来确保 d 后面的内容只执行一次。

    实际上,我使用最近的 rake 版本尝试了您的示例,但无法重现您的问题:

    > rake --version
    rake, version 10.1.0
    > rake
    d
    b
    c
    a
    > rake -m
    d
    b
    c
    a
    

    【讨论】:

      【解决方案2】:

      由于先决任务是按顺序运行的,是否只有一个从 C 到 D 的依赖任务,而没有一个从 B 的依赖任务。这样可以确保 B 和 C 在 D 运行之前都已运行。

      【讨论】:

      • Prereq 任务不是按顺序运行的,如果你rake -m 是并发运行的。
      • 在这种情况下我会跳过并发任务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2023-03-13
      • 2018-02-25
      相关资源
      最近更新 更多