[英]Make Capistrano use alias on sever when running scripts
使用Laravel与Capistrano时出现以下问题:
php
提供cli php版本,而仅通过usr/bin/local/.../PHP-CLI
命令提供 .bash_profile
为其创建了别名,因此从cli运行composer install
没问题。 但是,Capistrano(据我了解,由于它以非常基本的外壳开头,因此http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not- in-capistrano / )不会加载此别名,因此我从composer脚本(例如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的“命令映射”功能,如此处所述: 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
。 无论如何,这2个通常是可以通过composer调用的composer脚本,但是--no-scripts
标志可防止调用它们,因此安装时不会失败。 从capistrano调用它们时,您可以轻松地更改要使用的php
。
但是,如果有人有更好的解决方案,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.