今天我在我的 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
它打印
/home/tomcat/生产-tomcat
我正期待着/home/tomcat/stage-tomcat。如果我删除第一行path = "/home/tomcat/tomcat"
从 rake 文件来看,它按预期工作。
知道为什么这个科拉维里吗? :)
提前致谢!!
这并不是 Rake 所特有的,它只是词法作用域和 Ruby 处理局部变量以及在首次使用时声明它们的方式的结果。
首先你分配一个值path
:
path = "/home/tomcat/tomcat"
然后你创建stage
命名空间并重新分配变量:
path = "/home/tomcat/stage-tomcat"
请注意,无论您指定什么任务,都会执行此行,因为它不在任何任务中。
接下来您创建java_deploy
任务,但尚未运行。这个任务指的是path
变量,但是当调用任务时它的值可能已经改变。
后来,当定义production
命名空间此变量被重新分配again。重要的是这是仍然是相同的变量:
path = "/home/tomcat/production-tomcat"
当任务实际运行时,它指的是path
变量,并且该变量的值是分配给它的最新值,即/home/tomcat/production-tomcat
.
当您删除第一个分配给path
,那么该变量在顶层不存在。这意味着当您分配给path
在每个命名空间定义中,您在每种情况下都声明一个新的(且单独的)局部变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)