我正在尝试为 Capistrano 3 编写一个任务,该任务涉及在当前版本的目录中执行"作曲家安装"。它看起来像这样:
namespace :composer do
desc 'Install dependencies with Composer'
task :install do
on roles(:web) do
within release_path do
execute "#{fetch(:composer_command)} install"
end
end
end
end
composer_command
设置在暂存和生产文件中 - 在我的特定情况下是php /home/user/composer.phar
由于某种原因,此命令实际上并不在当前发布目录中运行,而是在父目录中运行(包含当前、共享、发布等)
我深入研究了一下,发现当我运行一个单词命令时,例如:
within release_path do
execute "pwd"
end
它工作正常,并在当前发布目录中运行命令。但。。。当我运行带有空格的命令时,例如:
within release_path do
execute "pwd && ls"
end
它在父目录中运行,而不是在within
块设置的目录中运行。
有人可以对此有所了解吗?谢谢!
闻起来像Cap 3错误。
我建议从外壳的角度来看,保证你处于你想去的地方:
execute "cd '#{release_path}'; #{fetch(:composer_command)} install"
您可以保留within()
、with()
、default_env
等的所有细节,同时仍保留自然字符串语法:
within release_path do
execute *%w[ pip install -r requirements.txt ]
end
几个提示:
1)Capistrano将SSHKit用于很多事情,其中包括命令执行。为了简化使用Composer,您可以配置命令映射(deploy.rb
或production.rb
等),这里有2个示例:
SSHKit.config.command_map[:composer] = "#{shared_path.join('composer.phar')}"
SSHKit.config.command_map[:composer] = '/usr/bin/env composer.phar'
接下来你可以像这样执行它:
execute :composer, :install
2)从安全角度来看,禁用php设置allow_url_fopen
是明智的,但不幸的是,Composer需要启用它才能运行。您可以使用此技巧将其全局禁用:
SSHKit.config.command_map[:composer] = "/usr/bin/env php -d allow_url_fopen=On #{shared_path.join('composer.phar')}"
查看 iniscan 以获取有关 php 设置的更多安全建议。
3) Composer有一个选项 -d, --working-dir
,您可以指向包含composer.json
文件的目录,以便从任何其他目录运行 Composer。这应该可以解决您的问题:
execute :composer, '-d', release_path, :install
4)你可能想看看capistrano-composer项目:)
,您对within
函数的使用几乎是正确的。您已经为它提供了整个字符串作为命令,但文档指出这会导致不可靠的行为(我自己经历过)。
让第一个参数execute
为符号而不是字符串(包含空格):
within release_path do
execute fetch(:composer_command).to_sym, "install"
execute :pwd
execute :ls
end
仅供参考的是Capistrano Doc,解释了为什么within {}
不适用于带有空格的参数。我希望这有所帮助。