Capistrano:fetch方法在deploy.rb开头不返回值

时间:2017-10-26 05:15:54

标签: php ruby-on-rails laravel capistrano

我是Capistrano的新手。

基本上我想使用deploy_to路径中的用户收到的客户端名称。

    set :client, ask('client name','demo')
    fetch :client`

然后我将deploy_to设置为

    set :deploy_to, '/php/ca/stg/#{fetch :client}/#{fetch :application}'
    set :shared_directory, '/php/ca/stg/#{fetch :client}/shared'

不幸的是,fetch无法解析值。它在路径中就像#{fetch:client}一样。

然而,它在任务中完美地解决了。例如:

    before :starting, :check_branch do
      run_locally do
        unless execute :git, 'ls-remote --exit-code', fetch(:repo_url), fetch(:branch), { raise_on_non_zero_exit: false }
           fatal "Specified branch or tag #{fetch(:branch)} for client #{fetch(:client)} does not exist in remote repository."
           exit 1
        end
      end
    end

我想我错过了一些东西,或者我不明白这种方法是如何工作的。正如我所说,我刚开始使用Capistrano。我正在尝试使用它来部署我的Laravel应用程序。

使用用户输入设置动态变量的解决方案是什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

要动态设置变量,您需要使用-> { ... }语法。这会延迟括号之间的代码评估,直到您收集了用户输入。

另外,在Ruby中要进行字符串插值,你必须使用双引号,而不是单引号。

所以你可以写:

set :deploy_to, -> { "/php/ca/stg/#{fetch(:client)}/#{fetch(:application)}" }

为了清晰起见,我还添加了括号(它们是可选的)。

最后,获得用户输入的更简洁的语法只是ask。对set的调用是多余的。换句话说,我建议:

ask :client, "demo"

这会提示用户提供:client变量的值,demo为默认值。