你如何在Rake任务之间进行通信?

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

task :obtain do # obtain files from somewhere end task :compile => :obtain do # do compilation end 

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

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

另一方面,如果您将代码保存在单独的类/模块/方法中,您甚至不必处理那些类型的黑客攻击+您的代码将更易于测试。

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

 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