2011-02-14 49 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