在gem / submodule中使用capistrano运行`rails db:migrate`

时间:2019-04-09 00:04:33

标签: ruby-on-rails ruby rubygems capistrano git-submodules

我有一个Rails 5.2应用程序。我正在尝试使用Capistrano进行部署。

该应用程序具有gem依赖项子模块,其中包含该项目所需的所有模型和迁移。此子模块取决于.gemspec中的其他宝石。

因此,我需要在子模块根目录而不是父项目根目录中运行rails db:migrate

我已将以下内容添加到deploy.rb

  desc 'Runs rake db:migrate if migrations are set'
  task :migrate => [:set_rails_env] do
    on primary fetch(:migration_role) do
      within "#{release_path}/PATH/TO/SUBMODULE" do
        with rails_env: fetch(:rails_env) do
          execute :rake, "db:migrate"
        end
      end
    end
  end

  before :starting,    :migrate

宝石文件:

gem 'dependency', path: 'PATH/TO/SUBMODULE'
gem 'capistrano-git-with-submodules', '~> 2.0'
group :development do
  gem 'capistrano',         require: false
  gem 'capistrano-rvm',     require: false
  gem 'capistrano-rails',   require: false
  gem 'capistrano-bundler', require: false
  gem 'capistrano3-puma',   require: false
end

当我尝试运行此任务时,收到一条错误消息,提示:

 DEBUG [b4c1cf18]   [31mCould not find aasm-5.0.2 in any of the sources[0m
 DEBUG [b4c1cf18]   
 DEBUG [b4c1cf18]   [33mRun `bundle install` to install missing gems.[0m
 DEBUG [b4c1cf18]

似乎在部署父项目时使用的gem set(包含所有父级和子模块gem)不在路径中,或者在运行该任务时不可用。

我可以在不进行迁移的情况下使父项目运行,因此我知道父项目正在在运行时加载所有正确的gem集。只是不在此任务期间。

我不太确定Capistrano是如何在后台运行的,如何确保这些宝石在任务运行时可用?

1 个答案:

答案 0 :(得分:0)

我知道了,我需要三件事:

1。execute :bundle之前execute :rake, :"db:migrate"

  1. within "#{release_path}/PATH/TO/SUBMODULE"提供第二个参数以使其成为within "#{release_path}/PATH/TO/SUBMODULE", release_path-找不到有关此文档的文档,仅此PR:https://github.com/capistrano/bundler/pull/84

  2. 符号链接到引擎,因此它不会阻止任何任务运行:

    task :symlink_secrets do
        on roles(:app) do
          execute "rm -rf #{release_path}/PATH/TO/SUBMODULE/spec/dummy/config/secrets.yml"
          execute "ln -nfs ~/secrets.yml #{release_path}/PATH/TO/SUBMODULE/spec/dummy/config/secrets.yml"
        end 
    end