У меня есть приложение для рельсов 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
Gemfile:
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]
Похоже, что набор драгоценных камней (содержащий все родительские драгоценные камни и подмодули), используемый при развертывании родительского проекта, отсутствует в пути или недоступен, когда приходит время запуска этой задачи.
Я могу запустить родительский проект без миграций, поэтому я знаю, что родительский проект загружает весь правильный набор драгоценных камней во время выполнения. Только не во время этой задачи.
Я не совсем понимаю, как Capistrano работает под капотом, как я могу убедиться, что эти драгоценные камни доступны для этой задачи, когда она работает?
@arieljuod да, это специальный драгоценный камень, и да, он может успешно их связать, но не во время этой задачи.
Я разобрался, мне нужно было 3 вещи:
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
Все драгоценные камни, которые я использовал, просто копируют миграции в папку проекта db/migrate. Ваш драгоценный камень изготовлен по индивидуальному заказу? Однако ошибка не связана с миграциями, она говорит, что не может найти aasm-5.0.2, войдите на свой сервер и запустите установку пакета в корне вашего проекта и убедитесь, что он успешно завершился.