そのため、私はレール (ruby 1.9.3p392、レール 3.2、sqlite3 db) をいじっており、ユビキタスなブログ チュートリアル コードを「実稼働」サーバー (Apache、パッセンジャー、ubuntu) にデプロイしようとしています。私の deploy.rb は次のようになります。
require 'bundler/capistrano'
require 'rvm/capistrano'
load 'deploy/assets'
set :rvm_ruby_string, ENV['GEM_HOME'].gsub(/.*\//,"")
set :rvm_type, :user
set :user, 'blah'
set :application, 'railsTest'
set :domain, 'www.blah.com'
set :applicationdir, "/home/sean/public/blah.com/public"
set :scm, 'git'
set :repository, "ssh://blah@1.1.1.1/home/blah/public/bla.com/public/capDep.git"
#set :git_enable_submodules, 1 # if you have vendored rails
set :branch, 'master'
set :git_shallow_clone, 1
set :scm_verbose, true
set :use_sudo, false
# roles (servers)
role :web, domain
role :app, domain
role :db, domain, :primary => true
# deploy config
set :deploy_to, applicationdir
set :deploy_via, :export
set :migrate_target, :latest
# additional settings
default_run_options[:pty] = true # Forgo errors when deploying from windows
#ssh_options[:keys] = %w(/home/blah/.ssh/id_rsa)
ssh_options[:forward_agent] = true
# if you want to clean up old releases on each deploy uncomment this:
# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
task :start do ; end
task :stop do ; end
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
end
end
#after "deploy:update_code", "deploy:migrate"
さて、カピストラーノで何をしているのかを知っている人にとっては、それは大きな混乱のように見えるに違いないと確信していますが、私は完全にルーブです. 最終的に、私の不備にもかかわらず、展開はうまくいくようです。なぜなら、次を実行すると
cap deploy:setup
cap deploy
私のアプリは稼働しており、できるという理由だけで、レールによって作成された Web UI を介してデータベースのテーブルにいくつかの行を追加します。ここで、大胆に移行を作成し、テーブルに列を追加します。変更を git にプッシュします。恐ろしいことに、私が走るとき
cap deploy
すべての移行が実行され、テーブルが再作成され、すべてのデータが破壊されます。この苦しいプロセスを何度か繰り返しました。私の schema_migrations テーブルは次のようになります。
20130620210004
20130620220229
20130628213331
20130628214946
20130628223002
ここで何が欠けていますか?
更新: 私は最近、コマンド ラインで deploy:migrations を実行し、それを deploy.rb から削除することに関する @TheMahrvin の提案を行いました。うまくいきませんでした...もう一度、すべての移行が実行されました。サーバー自体で db:migrate を実行してみることにしたので、ミューズが耳元で何かささやいたに違いありません。「rake」だけを実行した後、この出力を見て驚いた:
20130717230110 CreateHighScores
20130717230342 CreateGames
20130717231041 AddGameTypeToGame
20130717233707 AddGamePublisherToGame
20130717234124 AddGameRatingToGame
20130731210558 AddGameMechanicToGame
最後の移行のみを保留にする必要があります。したがって、おそらくこれは Capistrano ではまったく問題ではありません (それを反映するために、この質問のタイトルを更新しました)。では、以前の移行がまだ保留中としてフラグ付けされているのはなぜですか? 私はそれらが過去に実行されたことを知っています。これは、出力でそれらを確認し、実行後に db スキーマを確認したためです。
更新#2: 別の移行をセットアップし、サーバーにsshして、「現在の」ディレクトリに移動します。これは、カピストラーノをまったく理解していれば(大きなチャンス)、現在のファイルがある場所です。ランニング
bundle exec rake db:migrate:status
私を得た:
Status Migration ID Migration Name
--------------------------------------------------
down 20130717230110 Create high scores
down 20130717230342 Create games
down 20130717231041 Add game type to game
down 20130717233707 Add game publisher to game
down 20130717234124 Add game rating to game
down 20130731210558 Add game mechanic to game
down 20130731212454 Add publish year to game
down 20130731214515 Add game rank to game
down 20130731214928 Add game abbr to game
down 20130731215749 Add crazy field to game
自分がやろうとしていることは何か根本的に間違っていると感じずにはいられない.