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

时间:2016-07-18 12:47:16

标签: php capistrano capistrano3

使用Capistrano和laravel我有以下问题:

  • 我的托管服务提供商未通过php提供cli php版本,但仅通过usr/bin/local/.../PHP-CLI命令提供
  • 我确实在.bash_profile为其创建了一个别名,因此从cli运行composer install没问题。

然而,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

2 个答案:

答案 0 :(得分:2)

听起来你的情景非常适合Capistrano"命令地图"功能,如此处所述: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"
    
  3. 如果您希望此替换影响所有部署环境,请将其放在deploy.rb中。如果它仅适用于您的生产环境,请将其放在production.rb

答案 1 :(得分:0)

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

在您在部署更新时执行的脚本中的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"

如果需要artisan clear-compiled,我不能100%确定。无论如何,那些2是通常通过composer调用的编写器脚本,但是--no-scripts标志使它们不被调用,因此它在安装时不会失败。从capistrano调用它们时,我可以轻松地更改要使用的php,如您所见。

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