2011-02-14 22 views
4

我有此任務將生產日誌下載到本地機器。如果你有一臺機器運行,但是如果你有幾個文件會覆蓋它們自己,它工作正常。Capistrano - 機器名稱

namespace :log do 
    desc "Get production log files" 
    task :get_prod, :roles => :app do 
    download("/home/user/myapp/shared/log/production.log", "log/production.log") 
    end 
end 

我想添加某種標識符的文件名,所以它是唯一的,但我不知道要使用什麼?是否有我可以使用的capistrano變量?

回答

4

是的,您可以使用一個特殊的變量。這個變量(「$ CAPISTRANO:HOST $」)需要放在目標文件的名字中。 Capistrano將使用它當前傳輸文件的主機的名稱對其進行插值。 *

現在您的代碼看起來就像這樣:

namespace :log do 
    desc "Get production log files" 
    task :get_prod, :roles => :app do 
    download("#{shared_path}/log/production.log", "log/production.$CAPISTRANO:HOST$.log") 
    end 
end 

請看到我還使用了可變shared_pa​​th使代碼更幹。將配置保存在一個地方是一種很好的做法。


*的字符串插值的源代碼中的lib/Capistrano的/ transfer.rb線194(在2.5.19 Capistrano的):

... 
def normalize(argument, session) 
    if argument.is_a?(String) 
    argument.gsub(/\$CAPISTRANO:HOST\$/, session.xserver.host) 
    elsif argument.respond_to?(:read) 
... 

一般的建議是:如果你嘗試首先在互聯網上查找某些東西,當你發現它的速度非常快,然後查看源代碼(它不會咬人,並讓你知道你正在使用的工具是如何工作的)。

+0

@預先感謝deploy_to/shared到shared_pa​​th重構建議 – 2013-10-14 08:44:53