【问题标题】:Run `rails db:migrate` with capistrano in a gem/submodule在 gem/子模块中使用 capistrano 运行`rails db:migrate`
【发布时间】:2019-04-09 00:04:32
【问题描述】:

我有一个 rails 5.2 应用程序。我正在尝试使用 Capistrano 部署它。

该应用程序有一个 gem 依赖子模块,其中包含该项目所需的所有模型和迁移。该子模块依赖于 .gemspec 中的其他 gem。

因此,我需要在子模块根目录下运行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 集(包含所有父模块和子模块 gem)不在路径中,或者在运行此任务时不可用。

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

我不太确定 Capistrano 在后台是如何工作的,我如何确保这些 gem 在运行时可用于此任务?

【问题讨论】:

  • 我使用的所有 gem 只是将迁移复制到项目的 db/migrate 文件夹。你的宝石是定制的吗?该错误与迁移无关,它说它找不到 aasm-5.0.2,登录到您的服务器并在项目的根目录上运行 bundle install 并确保它成功结束。
  • @arieljuod 是的,它是一个自定义的 gem,是的,它可以成功地捆绑它们,只是在这个任务期间没有

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


【解决方案1】:

我想通了,我需要三样东西:

1.execute :bundleexecute :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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2019-02-16
    • 2018-09-29
    • 2015-04-15
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多