Ruby on rails cap部署期间没有此类文件或目录:更新

Ruby on rails cap部署期间没有此类文件或目录:更新,ruby-on-rails,capistrano,Ruby On Rails,Capistrano,我在cap deploy:update的输出中注意到,它正在触发“deploy:assets:precompile”,作为deploy:update\u代码的后回调: triggering after callbacks for `deploy:update_code' * 2013-05-15 11:32:16 executing `deploy:assets:precompile' triggering before callbacks for `deploy:assets:pr

我在cap deploy:update的输出中注意到,它正在触发“deploy:assets:precompile”,作为deploy:update\u代码的后回调:

triggering after callbacks for `deploy:update_code'
  * 2013-05-15 11:32:16 executing `deploy:assets:precompile'
    triggering before callbacks for `deploy:assets:precompile'
  * 2013-05-15 11:32:16 executing `deploy:assets:update_asset_mtimes'
  * executing "[ -e /home/johnmerlino/public_html/store.johnmerlino.com/shared/assets/manifest* ] && cat /home/johnmerlino/public_html/store.johnmerlino.com/shared/assets/manifest* || echo"
    servers: ["xxx.xx.xx.xxx"]
    [xxx.xx.xx.xxx] executing command
    command finished in 314ms
  * executing "cd -- /home/johnmerlino/public_html/store.johnmerlino.com/releases/20130515153214 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile"
    servers: ["xxx.xx.xx.xxx"]
    [xxx.xx.xx.xxx] executing command
 ** [out :: xxx.xx.xx.xxx] rake aborted!
 ** [out :: xxx.xx.xx.xxx] No such file or directory - /home/johnmerlino/public_html/store.johnmerlino.com/releases/20130515153214/config/config.yml
 ** [out :: xxx.xx.xx.xxx
after "deploy:update_code", "deploy:symlink_shared_configs"

namespace :deploy do

 desc "Symlink configuration files"
 task :symlink_shared_configs, :roles => [:db,:app] do
   run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
   run "ln -nfs #{shared_path}/config/config.yml #{release_path}/config/config.yml"
 end

 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
现在的问题是,最新版本没有“config.yml”文件

实际上,在我的capistrano脚本中,该文件是在“deploy:update_code”之后创建的:


那么此时不应该创建config.yml吗?

如果部署:更新\u code之后的
回调列表中触发了这两个回调,那么它们本质上是同一回调组的一部分,但调用同一组中回调的顺序取决于它们

如果您需要它们以给定的顺序运行,那么您可以在运行
assets:precompile
时显式更改,方法是稍后移动它,或者更早地移动
config.yml
文件,以确保一个文件在另一个之前

目前,由于它们都在部署后的
中运行:update_code
,因此它们的执行顺序可以是:

  ...before...
deploy:update_code
  ...after...                     | after group
  deploy:symlink_shared_configs   | after group
  deploy:assets:precompile        | after group
……或者

  ...before...
deploy:update_code
  ...after...                     | after group
  deploy:assets:precompile        | after group
  deploy:symlink_shared_configs   | after group

…基于您已经发布了这个问题的事实,听起来后一种情况正在发生。

好吧,我在某个地方读到,load“deploy/assets”应该放在Capfile中。但根据您的指示,为了使其正常工作,我必须在我的deploy.rb文件中的“deploy:update\u code”、“deploy:symlink\u shared\u configs”之后的行后面放置load“deploy/assets”。它起作用了,但我认为load deploy/assets属于capfile,这可能会起作用,但我不是建议移动
load
语句-我的意思是更改触发
deploy:assets:precompile
的回调,以便在符号链接之后触发它。我的意思不是实际移动代码行,而是通过更改与之相关的回调来更改执行顺序。它通过移动
load
语句来工作的事实是脆弱的,一旦有人再次编辑该文件并无意中以另一种方式更改了顺序,它就会崩溃,而更改触发它的回调则是强制执行顺序的一种更健壮、更持久的方法。