ruby-on-rails – 命名空间下的Rake任务变量

我今天在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

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

/家庭/ tomcat的/生产的tomcat

我期待/ home / tomcat / stage-tomcat.如果我从rake文件中删除第一行路径=“/ home / tomcat / tomcat”,它将按预期工作.

知道为什么这个kolavari? 🙂

提前致谢!!

最佳答案 这不是Rake特有的,它只是词法范围和Ruby处理局部变量的方式的结果,在首次使用时声明它们.

首先,为路径指定一个值:

path = "/home/tomcat/tomcat"

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

path = "/home/tomcat/stage-tomcat"

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

接下来,您将创建java_deploy任务,但它尚未运行.此任务引用路径变量,但在调用任务时,它的值可能已更改.

稍后,在定义生产命名空间时,此变量将再次重新分配.重要的是,这仍然是同一个变量:

path = "/home/tomcat/production-tomcat"

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

当您删除第一个路径分配时,该变量不存在于顶层.这意味着当您在每个命名空间定义中分配路径时,您在每种情况下都声明一个新的(和单独的)局部变量.

点赞