如何在执行 Laravel Envoy 任务时访问 bash 中声明的变量


How can I access declared variable in bash when executing Laravel Envoy task?

我有简单的Envoy设置。服务器:

@servers(['ws' => 'ws.sk'])

。和简单的"ping"任务:

@task('ping-ws', ['on' => 'ws'])
    echo "Hello world from WS server!"
    echo $(pwd)
    pwd
    var_1="Hello"
    echo "${var_1}"
@endtask

我想为变量分配一些值并稍后访问它们。虽然结果很出乎意料:

envoy run ping-ws
Hello world from WS server!
/Users/davidlukac/dev/drupal/_devdesktop/davidlukac
/home
  1. $(pwd)命令在本地进行评估。

  2. 变量var_1未分配,或者超出下一行的范围。

这是预期行为吗?有解决方法吗?

查看代码,我们可以看到用于传递命令的方法。首先构建命令:

ssh ws.sk 'bash -se' << EOF-LARAVEL-ENVOY
echo "Hello world from WS server!"
echo $(pwd)
pwd
var_1="Hello"
echo "${var_1}"
EOF-LARAVEL-ENVOY

然后,该命令被发送到PHP的proc_open命令运行。

由于输入是通过 STDIN 传递的,因此在发送之前,它会被本地环境解释。您可以将上述内容复制并粘贴到终端中以查看相同的内容。

所需要的只是转义任何可能被本地环境解释的字符;在本例中,$字符。

@task('ping-ws', ['on' => 'ws'])
    echo "Hello world from WS server!"
    echo '$(pwd)
    pwd
    var_1="Hello"
    echo "'${var_1}"
@endtask

请注意,您可能需要双重逃生,不确定 Envoy 是否会尝试将第一次逃生占为己有。

如果需要,您可以使用命令行将选项值传递到 Envoy 任务中:

envoy run deploy --branch=master

您可以通过 Blade 的"echo"语法访问任务中的选项。当然,您也可以在任务中使用 if 语句和循环。例如,让我们在执行 git pull 命令之前验证 $branch 变量是否存在:

@servers(['web' => '192.168.1.1'])
@task('deploy', ['on' => 'web'])
    cd site
    @if ($branch)
        git pull origin {{ $branch }}
    @endif
    php artisan migrate
@endtask

它来自官方特使文档,因此欢迎您了解更多信息

如果要添加多个变量,只需根据需要附加尽可能多的变量即可。

envoy run deploy --var1=var1Value --var2=var2Value