运行 `rails db:migrate` 在 gem/submodule 中使用 Capistrano
Run `rails db:migrate` with capistrano in a gem/submodule
我有一个 rails 5.2 应用程序。我正在尝试使用 Capistrano 部署它。
该应用有一个 gem 依赖子模块,其中包含该项目所需的所有模型和迁移。这个子模块依赖于其他 gems 在它的 .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 集(包含所有父模块和子模块 gems)不在路径中,或者在 运行这个任务。
我可以在没有迁移的情况下获得父项目 运行ning,所以我知道父项目正在加载所有正确的 gem 集 运行。只是不在此任务期间。
我不太确定 Capistrano 是如何在幕后工作的,我如何确保这些 gems 在 运行s 时可用于此任务?
我想通了,我需要三样东西:
1.execute :bundle
在 execute :rake, :"db:migrate"
之前
向 within "#{release_path}/PATH/TO/SUBMODULE"
提供第二个参数以使其成为 within "#{release_path}/PATH/TO/SUBMODULE", release_path
- 找不到关于此的文档,只有此 PR:https://github.com/capistrano/bundler/pull/84
引擎的符号链接秘密,因此它不会阻止来自 运行:
的任何任务
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
我有一个 rails 5.2 应用程序。我正在尝试使用 Capistrano 部署它。
该应用有一个 gem 依赖子模块,其中包含该项目所需的所有模型和迁移。这个子模块依赖于其他 gems 在它的 .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 集(包含所有父模块和子模块 gems)不在路径中,或者在 运行这个任务。
我可以在没有迁移的情况下获得父项目 运行ning,所以我知道父项目正在加载所有正确的 gem 集 运行。只是不在此任务期间。
我不太确定 Capistrano 是如何在幕后工作的,我如何确保这些 gems 在 运行s 时可用于此任务?
我想通了,我需要三样东西:
1.execute :bundle
在 execute :rake, :"db:migrate"
向
within "#{release_path}/PATH/TO/SUBMODULE"
提供第二个参数以使其成为within "#{release_path}/PATH/TO/SUBMODULE", release_path
- 找不到关于此的文档,只有此 PR:https://github.com/capistrano/bundler/pull/84引擎的符号链接秘密,因此它不会阻止来自 运行:
的任何任务
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