当 运行 脚本时,让 Capistrano 在服务器上使用别名
Make Capistrano use alias on sever when running scripts
我将 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
听起来您的方案非常适合 Capistrano 的 "command map" 功能,如此处所述:https://github.com/capistrano/sshkit#the-command-map.
以下是两个要点:
编写 Capistrano execute
命令,使二进制名称 (php
) 成为一个单独的参数。这将允许使用命令映射替换它。例如:
execute :php, "composer.phar install --working-dir #{fetch(:release_path)}"
在您的 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
,如您所见。
但是,如果有人有更好的解决方案,请告诉我。
我将 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
听起来您的方案非常适合 Capistrano 的 "command map" 功能,如此处所述:https://github.com/capistrano/sshkit#the-command-map.
以下是两个要点:
编写 Capistrano
execute
命令,使二进制名称 (php
) 成为一个单独的参数。这将允许使用命令映射替换它。例如:execute :php, "composer.phar install --working-dir #{fetch(:release_path)}"
在您的 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
,如您所见。
但是,如果有人有更好的解决方案,请告诉我。