当 运行 脚本时,让 Capistrano 在服务器上使用别名

Make Capistrano use alias on sever when running scripts

我将 Capistrano 与 laravel 一起使用时遇到以下问题:

但是,Capistrano(据我所知,由于它以非常基本的 shell http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/ 开头)不会加载此别名,因此我从作曲家脚本中得到一个错误,例如php artisan.

但是,在我的开发机器上,我需要将其保留为 php,因为这是 php 所在的位置。

我怎样才能最好地解决这个问题?您需要更多信息吗?谢谢。

为了以防万一,我是这样调用脚本的:

desc 'Composer install'
task :composer_install do
    on roles(:app), in: :groups, limit:1 do
        execute "/usr/local/bin/php5-56STABLE-CLI composer.phar install --working-dir #{fetch(:release_path)}"
        execute "cp #{fetch(:deploy_to)}/shared/.env #{fetch(:release_path)}/.env"
    end
end

听起来您的方案非常适合 Capistrano 的 "command map" 功能,如此处所述:https://github.com/capistrano/sshkit#the-command-map.

以下是两个要点:

  1. 编写 Capistrano execute 命令,使二进制名称 (php) 成为一个单独的参数。这将允许使用命令映射替换它。例如:

    execute :php, "composer.phar install --working-dir #{fetch(:release_path)}"
    
  2. 在您的 Capistrano 部署配置中,告诉命令映射如何替换 :php 命令,如下所示:

    SSHKit.config.command_map[:php] = "/usr/local/bin/php5-56STABLE-CLI"
    

如果您希望此替换影响所有部署环境,请将其放在 deploy.rb 中。如果它仅适用于您的生产环境,则将其放入 production.rb.

好的,我目前的解决方法如下:

在您的 capistrano 中 deploy.rb 在您在部署更新时执行的脚本中。

    desc 'Composer install'
    task :composer_install do
        on roles(:app), in: :groups, limit:1 do
            execute "/usr/local/bin/php5-56STABLE-CLI /path/to/composer.phar install --working-dir #{fetch(:release_path)} --no-scripts"
            execute "cd #{fetch(:release_path)} && /usr/local/bin/php5-56STABLE-CLI artisan clear-compiled"
            execute "cd #{fetch(:release_path)} && /usr/local/bin/php5-56STABLE-CLI artisan optimize"
        end
    end

end

after "deploy:updated", "deploy:composer_install"

我不是 100% 确定是否需要 artisan clear-compiled。无论如何,这两个是通常会通过作曲家调用的作曲家脚本,但是 --no-scripts 标志阻止它们被调用,因此它不会在安装时失败。从 capistrano 调用它们时,我可以轻松更改要使用的 php,如您所见。

但是,如果有人有更好的解决方案,请告诉我。