因此,我正在使用rails (ruby1.9.3p392,rails 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我的应用程序已经启动并运行,因为我可以通过rails为我创建的web将几行添加到数据库中的一个表中。现在,我大胆地创建了一个迁移,将一个列添加到一个表中。我把我的改变推到git。令我恐惧的是,当我奔跑时
cap deploy所有迁移都将运行,这将重新创建表,从而破坏我的所有数据。我多次重复这个痛苦的过程。我的schema_migrations表如下所示:
20130620210004
20130620220229
20130628213331
20130628214946
20130628223002我在这里错过了什么?
更新:i最近给出了@TheMahrvin关于在命令行运行部署:迁移并将其从deploy.rb中删除的建议。不管用..。再次,所有的迁移都运行了。我的缪斯一定在我耳边说了些什么,因为我决定尝试运行db:在服务器本身上迁移。在运行“rake”之后,我惊讶地看到了这个输出:
20130717230110 CreateHighScores
20130717230342 CreateGames
20130717231041 AddGameTypeToGame
20130717233707 AddGamePublisherToGame
20130717234124 AddGameRatingToGame
20130731210558 AddGameMechanicToGame只有最后一次迁移应该挂起。所以,也许这根本不是卡皮斯特拉诺的问题(我已经更新了这个问题的标题以反映这一点)。那么,为什么以前的移民仍然被标记为待定?我知道它们是在过去运行的,这是因为我在输出中看到了它们,并在它们运行后验证了db模式。
更新2:设置了另一个迁移和ssh到服务器和cd到“当前”目录,如果我完全理解卡皮斯特拉诺(极有可能)是当前文件的位置。正在运行
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我情不自禁地感觉到,我想做的事情有很大的错误。
发布于 2013-07-31 23:24:58
好吧,想清楚了.不过,在我最初的问题中,基于红鲱鱼,堆叠圈里的其他人应该怎么做,这是我无法理解的。
问题是我的生产数据库被设置为
db/production.sqlite3因为它是主项目目录中的sqlite数据库,所以每次我运行时它都会被删除。
cap deploy然后,当我要跑
cap deploy:migrate它会找到一个空数据库,并认为所有迁移都需要运行。通过将数据库路径更改为
/my_absolute_path/shared/db/production.sqlite3感谢@TheMahvin和其他人,他们试图承担起回答我措辞拙劣的问题这一无望的任务!
H/T对这个问题,它使天平从我的眼睛下降:
发布于 2013-07-15 06:53:59
我还没看到:
after "deploy:update_code", "deploy:migrate"在此之前。尝试删除该行并运行:
bundle exec cap deploy:migrations (deploys code and migrations)或
bundle exec cap deploy:migrate (runs the migrate rake task on the server)而不是。在我看来,您的deploy.rb的其余部分似乎没问题,尽管我对rvm/capistrano集成或窗口调整一无所知。
发布于 2013-07-12 08:10:12
您是如何“向数据库中的表中添加几行”的?
我怀疑您的数据丢失是混合迁移和您自己的db更改造成的。Rails希望您通过迁移完成所有数据库更改。
Rails社区中普遍存在一些关于迁移的争论,但是现在(特别是如果您是初学者)总是使用迁移来更改数据库。这样,您就有了完整的db蓝图,允许您从零开始在多台计算机上部署,而无需修改数据库,并确保其他贡献者有相同的数据库可供使用。
我对这类内部设备不太了解,但据我所知,您的数据丢失导致了这样的结果:
在手动更改之后,Rails无法将db布局与任何迁移的结果(分别通过迁移中的时间戳和模式)相匹配,因此将db视为新的。要进入由所有迁移定义的状态,需要执行所有迁移,包括创建表的迁移,从而丢弃表中的所有内容。
我希望这能帮到你,
安迪
https://stackoverflow.com/questions/17374840
复制相似问题