db:schema:load
をdb:migrate
の代わりに実行したいと思っています。スキーマを実行する方法:最初のcapistrano 3をロードするrails appの
これはかなり以前はin this stack overflow questionと表示されていましたが、Capistrano 3では、deploy:cold
というタスクが非推奨になりました。最初のデプロイメントは、それ以降のすべてのデプロイメントと同じではありません。
提案がありますか?ありがとう!
db:schema:load
をdb:migrate
の代わりに実行したいと思っています。スキーマを実行する方法:最初のcapistrano 3をロードするrails appの
これはかなり以前はin this stack overflow questionと表示されていましたが、Capistrano 3では、deploy:cold
というタスクが非推奨になりました。最初のデプロイメントは、それ以降のすべてのデプロイメントと同じではありません。
提案がありますか?ありがとう!
deploy:cold
は、基本的に通常の展開タスクの複製として定義する必要がありますが、deploy:migrations
の代わりにdeploy:db_load_schema
です。たとえば、次のように
desc 'Deploy app for first time'
task :cold do
invoke 'deploy:starting'
invoke 'deploy:started'
invoke 'deploy:updating'
invoke 'bundler:install'
invoke 'deploy:db_load_schema' # This replaces deploy:migrations
invoke 'deploy:compile_assets'
invoke 'deploy:normalize_assets'
invoke 'deploy:publishing'
invoke 'deploy:published'
invoke 'deploy:finishing'
invoke 'deploy:finished'
end
desc 'Setup database'
task :db_load_schema do
on roles(:db) do
within release_path do
with rails_env: (fetch(:rails_env) || fetch(:stage)) do
execute :rake, 'db:schema:load'
end
end
end
end
それもデフォルトdeploy
に含まれたタスクは、時間の経過とともに変更される可能性があるとして、独立deploy:db_schema_load
タスクを実行する方が良いかもしれません。
それ種子がデータベースのテーブルを作成した後ので、私は実際に新鮮が展開するためのdb:setup
を使用して:
desc 'Setup database'
task :db_setup do
...
execute :rake, 'db:setup'
...
end
を、私は、あまりにも、カピストラーノに新しいです、とRailsアプリを展開する最初の時間のためにそれを使用しようとしていますパペットで設定したプロダクションサーバーに送信します。
最終的に私は自分自身のために何を決定するかを感じる前に、Capistranoのソース(とcapistrano/bundler、capistrano/rails、さらにはsshkitとnet-ssh)を掘り下げて、私が作りたいと思っていた変更。私はちょうどそれらの変更を完了し、私は結果に満足している:
# lib/capistrano/tasks/cold.rake
namespace :deploy do
desc "deploy app for the first time (expects pre-created but empty DB)"
task :cold do
before 'deploy:migrate', 'deploy:initdb'
invoke 'deploy'
end
desc "initialize a brand-new database (db:schema:load, db:seed)"
task :initdb do
on primary :web do |host|
within release_path do
if test(:psql, 'portal_production -c "SELECT table_name FROM information_schema.tables WHERE table_schema=\'public\' AND table_type=\'BASE TABLE\';"|grep schema_migrations')
puts '*** THE PRODUCTION DATABASE IS ALREADY INITIALIZED, YOU IDIOT! ***'
else
execute :rake, 'db:schema:load'
execute :rake, 'db:seed'
end
end
end
end
end
デプロイ:デプロイ前に実行するタスクinidb:移行冷たいタスクは単に私のカスタム展開をフックします。このようにして、スキーマとシードがロードされ、実行する新しい移行がないため、後に続くdeploy:migrateステップは何もしません(安全に)。安全のために、deploy:coldを実行した場合にスキーマを読み込む前に、schema_migrationsテーブルがすでに存在するかどうかを調べます。
注:私は、プロペットを使用してDBを作成することを選択しましたので、私のプロダクションpostgresqlユーザにCREATEDB権限を与える必要はありませんが、カピストラノにそれを実行させたい場合は、 "execute:rake、 'db:create ':db:schema:loadの前に' 'を追加するか、3つの行をすべて' db:setup 'で置き換えてください。
ありがとうございます。展開を再現するという私の本能で私はより快適になりました。あなたの下に自分のバージョンを投稿しました。 – odigity