【问题标题】:Make Capistrano use alias on sever when running scripts运行脚本时让 Capistrano 在服务器上使用别名
【发布时间】:2016-07-18 12:47:15
【问题描述】:

我在使用 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

【问题讨论】:

    标签: php capistrano capistrano3


    【解决方案1】:

    听起来您的场景非常适合 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"
      

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

    【讨论】:

    • 嘿,我认为这行不通(如果我错了,请纠正我)因为 php 调用在 composer.json 文件中,并且该文件需要在没有 Capistrano 的情况下在我的开发机器上运行。所以你的解决方案行不通,对吗?如果我误解了什么,请告诉我。
    • 我不能像使用 bash 别名那样替换 php,对吗?
    • 对,这种替换仅适用于由显式 Capistrano execute 命令完成的 php 调用。如果php 命令隐藏在另一个脚本中,我的回答将无济于事。
    【解决方案2】:

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

    在您的 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,如您所见。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多