Rails 3.2.1, ресурсы предварительно скомпилированы при развертывании? - PullRequest
6 голосов
/ 27 февраля 2012

У меня есть задание Capistrano:

namespace :deploy do
  task :precompile, :role => :app do
    run "cd #{release_path}/ && RAILS_ENV=staging bundle exec rake assets:precompile --trace"
  end
end

after "deploy:finalize_update", "deploy:precompile"

Я знаю, что есть load 'deploy/assets', но я пытаюсь понять, что здесь происходит.

Я развертываю на Amazon EC2 m1.small экземпляре, который, по-видимому, постоянно 50% времени кражи процессора , проверяется с помощью top. Это приводит к увеличению времени на компиляцию ресурсов, но посмотрите на это:

    [23.21.xxx.xx] rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell 'ruby-1.9.3-p125' -c 'cd /home/ubuntu/apps/myapp-rails/releases/20120227020245/ && RAILS_ENV=staging bundle exec rake assets:precompile --trace'
 ** [out :: 23.21.xxx.xx] ** Invoke assets:precompile (first_time)
 ** [out :: 23.21.xxx.xx] ** Execute assets:precompile
 ** [out :: 23.21.xxx.xx] /home/ubuntu/.rvm/rubies/ruby-1.9.3-p125/bin/ruby /home/ubuntu/apps/myapp-rails/shared/bundle/ruby/1.9.1/bin/rake assets:precompile:all RAILS_ENV=staging RAILS_GROUPS=assets --trace
 ** [out :: 23.21.xxx.xx] ** Invoke assets:precompile:all (first_time)
 ** [out :: 23.21.xxx.xx] ** Execute assets:precompile:all
 ** [out :: 23.21.xxx.xx] ** Invoke assets:precompile:primary (first_time)
 ** [out :: 23.21.xxx.xx] ** Invoke assets:environment (first_time)
 ** [out :: 23.21.xxx.xx] ** Execute assets:environment
 ** [out :: 23.21.xxx.xx] ** Invoke environment (first_time)
 ** [out :: 23.21.xxx.xx] ** Execute environment
 ** [out :: 23.21.xxx.xx] ** Invoke tmp:cache:clear (first_time)
 ** [out :: 23.21.xxx.xx] ** Execute tmp:cache:clear
 ** [out :: 23.21.xxx.xx] ** Execute assets:precompile:primary
 ** [out :: 23.21.xxx.xx] ** Invoke assets:precompile:nondigest (first_time)
 ** [out :: 23.21.xxx.xx] ** Invoke assets:environment (first_time)
 ** [out :: 23.21.xxx.xx] ** Execute assets:environment
 ** [out :: 23.21.xxx.xx] ** Invoke environment (first_time)
 ** [out :: 23.21.xxx.xx] ** Execute environment
 ** [out :: 23.21.xxx.xx] ** Invoke tmp:cache:clear (first_time)
 ** [out :: 23.21.xxx.xx] ** Execute tmp:cache:clear
 ** [out :: 23.21.xxx.xx] ** Execute assets:precompile:nondigest
    command finished in 958131ms

Помимо безумного количества времени, затрачиваемого на прекомпиляцию ресурсов, по какой-то причине я могу сказать, что они компилируются дважды. Почему?

Я использую Rails 3.2.1. Может кто-нибудь подсказать, что здесь происходит? Это предназначено?

staging.rb

  # Compress JavaScripts and CSS
  config.assets.compress = true

  # Don't fallback to assets pipeline if a precompiled asset is missed
  config.assets.compile = false

  # Generate digests for assets URLs
  config.assets.digest = true

1 Ответ

10 голосов
/ 27 февраля 2012

load 'deploy/assets' автоматически прекомпилирует ресурсы для вас в соответствующей части развертывания, поэтому вам не нужно определять задачу прекомпиляции. Вы можете удалить как задачу прекомпиляции, так и after "deploy:finalize_update", "deploy:precompile".

https://github.com/capistrano/capistrano/blob/master/lib/capistrano/recipes/deploy/assets.rb

edit: по умолчанию Rails создает файлы с отпечатками и файлы без отпечатков, когда для дайджеста установлено значение true. На самом деле он не выполняет всю задачу прекомпиляции дважды, он просто запускает одну задачу для каждой ситуации.

Если вы хотите полностью отключить создание файлов без отпечатков, вы можете переопределить задачу assets:precompile:all.

Rake::Task['assets:precompile:all'].clear
namespace :assets do
  namespace :precompile do
    task :all do
      Rake::Task['assets:precompile:primary'].invoke
      # ruby_rake_task("assets:precompile:nondigest", false) if Rails.application.config.assets.digest
    end
  end
end

Закомментированная строка - это строка 66 здесь:

https://github.com/rails/rails/blob/master/actionpack/lib/sprockets/assets.rake

...