Rake命名空间下的任务变量

Jit*_*ani 5 ruby rake ruby-on-rails rake-task

今天我在我的 rake 脚本中看到了一件奇怪的事情。我在不同的命名空间下有两个 Rake 任务,如下所示:

path = "/home/tomcat/tomcat"

namespace :stage do
  path = "/home/tomcat/stage-tomcat"
  desc "Deploys a java application to stage tomcat"
  task :java_deploy do
    puts path # stage:java_deploy should print /home/tomcat/stage-tomcat
  end
end

namespace :production do
  path = "/home/tomcat/production-tomcat"
  desc "Deploys a java application to production tomcat"
  task :java_deploy do
    puts path # production:java_deploy should print /home/tomcat/production-tomcat
  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行时:rake stage:java_deploy它打印

/home/tomcat/生产-tomcat

我期待/home/tomcat/stage-tomcatpath = "/home/tomcat/tomcat"如果我从 rake 文件中删除第一行,它就会按预期工作。

知道为什么是这个科拉瓦里吗?:)

提前致谢!!

mat*_*att 6

这并不是 Rake 所特有的,它只是词法作用域和 Ruby 处理局部变量以及在首次使用时声明它们的方式的结果。

\n\n

首先,您为 分配一个值path

\n\n
path = "/home/tomcat/tomcat"\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后创建stage命名空间并重新分配变量:

\n\n
path = "/home/tomcat/stage-tomcat"\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,无论您指定什么任务,都会执行此行,因为它不在任何任务中。

\n\n

接下来,您创建java_deploy任务,但它尚未运行\xe2\x80\x99。该任务引用了该path变量,但是当调用该任务时,它的值可能已经改变。

\n\n

稍后,在定义production命名空间时,该变量会再次重新分配。重要的是这仍然是同一个变量

\n\n
path = "/home/tomcat/production-tomcat"\n
Run Code Online (Sandbox Code Playgroud)\n\n

当任务实际运行时,它引用该path变量,该变量的值是分配给它的最新值,即/home/tomcat/production-tomcat

\n\n

当您删除对 的第一个分配时path,变量 \xe2\x80\x99t 不存在于顶层。这意味着当您path在每个命名空间定义中分配给时,您在每种情况下都声明了一个新的(且单独的)局部变量。

\n