从不同的应用程序执行 capistrano
Executing capistrano from a different application
我需要从现有 ruby 脚本中触发 capistrano 部署。
例如,假设我想启动将监听一些消息的服务,并且在某些消息上我想使用 cap staging deploy
触发另一个应用程序的 capistrano 部署(如果我 运行 这个命令直接来自 shell)。
~/app-to-deploy
- Gemfile #including many dependencies
- config/deploy # capistrano files
~/my-service
- Gemfile # including different dependencies than `app-to-deploy`
- my_script.rb # that wishes to call `cap app-to-deploy deploy`
我想我可以 运行 我的服务中的 capistrano bash 脚本使用
# my_service.rb
Dir.chdir(ENV['HOME'] + '/app-to-deploy') do
result = system('bash', '-c', "cap staging deploy")
end
如果我 运行 它有或没有 bundle exec
这给出类似
cap aborted!
LoadError: cannot load such file -- active_support/all
/deploy/hermes/Capfile:2:in `require'
/deploy/hermes/Capfile:2:in `<top (required)>'
(See full trace by running task with --trace)
(我的 app-to-deploy
中有作为 gem 的 ActiveSupport,但 my-service
的 Gemfile 中没有它)
好像我有一个 lib 依赖问题,但我不确定如何解决它...
任何人都有解决问题的想法或方法吗? (或者更好的方法是在不使用 bash 的情况下调用 capistrano,假设我可能仍然有不同的依赖关系?)
(请注意,app-to-deploy
是一个实际的 Rails 应用程序,其中包含许多我不想接触的 Capistrano 脚本...)
问题是在unix系统环境下是继承的。因此,当您从 rails 应用程序调用 Capistrano 时,您无权访问其他 gem。 bash -c
似乎没有清理环境。你可以用 su -l
可能。
一种解决方案是使用
Bundler.with_clean_env do
Dir.chdir(ENV['HOME'] + '/app-to-deploy') do
result = system('bundle', 'exec', "cap", "staging", "deploy")
end
end
我需要从现有 ruby 脚本中触发 capistrano 部署。
例如,假设我想启动将监听一些消息的服务,并且在某些消息上我想使用 cap staging deploy
触发另一个应用程序的 capistrano 部署(如果我 运行 这个命令直接来自 shell)。
~/app-to-deploy
- Gemfile #including many dependencies
- config/deploy # capistrano files
~/my-service
- Gemfile # including different dependencies than `app-to-deploy`
- my_script.rb # that wishes to call `cap app-to-deploy deploy`
我想我可以 运行 我的服务中的 capistrano bash 脚本使用
# my_service.rb
Dir.chdir(ENV['HOME'] + '/app-to-deploy') do
result = system('bash', '-c', "cap staging deploy")
end
如果我 运行 它有或没有 bundle exec
这给出类似
cap aborted!
LoadError: cannot load such file -- active_support/all
/deploy/hermes/Capfile:2:in `require'
/deploy/hermes/Capfile:2:in `<top (required)>'
(See full trace by running task with --trace)
(我的 app-to-deploy
中有作为 gem 的 ActiveSupport,但 my-service
的 Gemfile 中没有它)
好像我有一个 lib 依赖问题,但我不确定如何解决它...
任何人都有解决问题的想法或方法吗? (或者更好的方法是在不使用 bash 的情况下调用 capistrano,假设我可能仍然有不同的依赖关系?)
(请注意,app-to-deploy
是一个实际的 Rails 应用程序,其中包含许多我不想接触的 Capistrano 脚本...)
问题是在unix系统环境下是继承的。因此,当您从 rails 应用程序调用 Capistrano 时,您无权访问其他 gem。 bash -c
似乎没有清理环境。你可以用 su -l
可能。
一种解决方案是使用
Bundler.with_clean_env do
Dir.chdir(ENV['HOME'] + '/app-to-deploy') do
result = system('bundle', 'exec', "cap", "staging", "deploy")
end
end