2015-05-19 67 views
3

今天我在我的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文件中刪除第一行path = "/home/tomcat/tomcat",它會按預期工作。

任何想法爲什麼這kolavari? :)

在此先感謝!

+0

如果你將這兩個命名空間定位在不同的文件中,該怎麼辦? –

+0

爲我這兩個任務打印...'/家/ tomcat/production-tomcat' .. –

+0

@StanislavMekhonoshin,將工作。即使刪除第一行,它將解決我單個rake文件的問題。但我想了解這裏的流程。 –

回答

2

這不是特定於Rake的,它只是詞法範圍和Ruby處理局部變量的方式的結果,在首次使用時聲明它們。

首先你一個值賦給path

path = "/home/tomcat/tomcat" 

然後創建stage命名空間,並重新分配變量:

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

注意,該行執行您指定的任何任務,因爲它不在任何任務中。

接下來,您將創建java_deploy任務,但該任務尚未運行。此任務引用path變量,但調用該任務時,其值可能已更改。

稍後,在定義production名稱空間時,此變量將再次被重新分配。更重要的,這是仍然是相同的變量

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

當任務實際運行,它是指path變量,這個變量的值是分配給它的最新值,這是/home/tomcat/production-tomcat

當您將第一個作業移除到path時,該變量不存在於頂層。這意味着當您在每個名稱空間定義中分配path時,您將在每種情況下聲明一個新的(和單獨的)局部變量。

+0

一些更多信息:http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/localvars.html – matt

+0

謝謝馬特。這清除了我的懷疑。 –