【问题标题】:How do you communicate between Rake tasks?你如何在 Rake 任务之间进行通信?
【发布时间】:2010-02-26 07:05:01
【问题描述】:

假设我有一个需要编译一些文件的目标。该目标有另一个目标作为先决条件,即获取文件的目标。 让我们这样说:

task :obtain do
  # obtain files from somewhere
end

task :compile => :obtain do
  # do compilation
end

假设:obtain 目标并不总是将文件放在同一个文件夹中。我将如何通过:compile :obtain 找到的路径?环境变量?

【问题讨论】:

    标签: ruby rake


    【解决方案1】:

    在我看来,使用 ENV['something'] 更可取,因为如果你这样做(而不是 $global 或 @instance 变量),你可以将它们视为任务参数,并轻松使用命令行中的子任务.

    另一方面,如果您将代码保存在单独的类/模块/方法中,您甚至不必处理这些黑客行为 + 您的代码将更具可测试性。

    【讨论】:

    • 是的。这就是我最终这样做的方式。谢谢!
    • 应该记住,ENV 只能将字符串作为键和值,所以虽然这个限制在文件名的情况下可能无关紧要,但在处理其他类型时可能不是一个好的解决方案价值。
    【解决方案2】:

    一种方法是将其存储在全局变量中:

    task :obtain do
      $obtained_dir = "/tmp/obtained"
    end
    
    task :compile => :obtain do
      puts "compiling files in #{$obtained_dir}"
    end
    

    实例变量(即@obtained_dir)也应该可以工作。

    另一种方法是将“获取”代码拉入方法中,如下所示:

    task :obtain do
      obtain_files
    end
    
    task :compile do
      obtained_dir = obtain_files
      puts "compiling files in #{obtained_dir}"
    end
    
    def obtain_files
      #obtain files from somewhere
      "/tmp/obtained_files"
    end
    

    【讨论】:

    • +1 表示将其放入方法中来执行此操作。 task :obtain 看起来根本不是任务,只是别人调用的方法。
    猜你喜欢
    • 2012-02-16
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2016-02-22
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多