Varlık hızı:3.1/3.2 Capistrano dağıtım derleme ile Raylar
Benim dağıtımları yavaş, en az 3 dakika sürer. Dağıtma sırasında yavaş Capistrano görevi varlıklar:derleme. Bu muhtemelen toplam dağıtmak 99% zaman alır. Bunu nasıl hızlandırabilirim? Benim yerel makinede benim varlık derleme ve git benim repo eklemek gerekir?
Edit: benim uygulama Ekleme config.assets.initialize_on_precompile = false
.rb dosya yarım dakika ile derleme kez düştü, ama hala yavaş.
CEVAP
Fikir varlık değişiklik yapacak olsaydı zaten onları her zaman yeniden derlemek için gerek yok
Bu gıt ile bir dağıtım için solution that Ben Curtis propose:
namespace :deploy do
namespace :assets do
task :precompile, :roles => :web, :except => { :no_release => true } do
from = source.next_revision(current_revision)
if releases.length <= 1 || capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0
run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
else
logger.info "Skipping asset pre-compilation because there were no asset changes"
end
end
end
end
Burada başka bir yaklaşım varlık yaşına göre (https://gist.github.com/2784462) :
set :max_asset_age, 2 ## Set asset age in minutes to test modified date against.
after "deploy:finalize_update", "deploy:assets:determine_modified_assets", "deploy:assets:conditionally_precompile"
namespace :deploy do
namespace :assets do
desc "Figure out modified assets."
task :determine_modified_assets, :roles => assets_role, :except => { :no_release => true } do
set :updated_assets, capture("find #{latest_release}/app/assets -type d -name .git -prune -o -mmin -#{max_asset_age} -type f -print", :except => { :no_release => true }).split
end
desc "Remove callback for asset precompiling unless assets were updated in most recent git commit."
task :conditionally_precompile, :roles => assets_role, :except => { :no_release => true } do
if(updated_assets.empty?)
callback = callbacks[:after].find{|c| c.source == "deploy:assets:precompile" }
callbacks[:after].delete(callback)
logger.info("Skipping asset precompiling, no updated assets.")
else
logger.info("#{updated_assets.length} updated assets. Will precompile.")
end
end
end
end
Varlık yerel derleme için tercih ederseniz, bu görevi kullanabilirsiniz:
namespace :deploy do
namespace :assets do
desc 'Run the precompile task locally and rsync with shared'
task :precompile, :roles => :web, :except => { :no_release => true } do
from = source.next_revision(current_revision)
if releases.length <= 1 || capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0
%x{bundle exec rake assets:precompile}
%x{rsync --recursive --times --rsh=ssh --compress --human-readable --progress public/assets #{user}@#{host}:#{shared_path}}
%x{bundle exec rake assets:clean}
else
logger.info 'Skipping asset pre-compilation because there were no asset changes'
end
end
end
end
Başka ilginç bir yaklaşım kullanarak olabilirgit kanca. Örneğin bu kod varlıklar herhangi bir farklılık varsa, dosyaları kontrol eder ve sonunda onları precompiles 9 ** ve güncel tamamlama eklemek için ekleyebilirsiniz.
#!/bin/bash
# source rvm and .rvmrc if present
[ -s "$HOME/.rvm/scripts/rvm" ] && . "$HOME/.rvm/scripts/rvm"
[ -s "$PWD/.rvmrc" ] && . "$PWD/.rvmrc"
# precompile assets if any have been updated
if git diff-index --name-only HEAD | egrep '^app/assets' >/dev/null ; then
echo 'Precompiling assets...'
rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
git add public/assets/*
fi
Eğer bu yaklaşımı kullanmaya karar verirseniz, muhtemelen config/environments/development.rb
ekleyerek değiştirmeniz gerekir:
config.assets.prefix = '/assets_dev'
Kalkınma sırasında önceden derlenmiş varlıklar hizmet olmaz.
Nasıl Raylar Varlık Boru hattı derleme...
Raylar yeni varlık yol Ekle 3.1...
Raylar 3.1 varlık boru hattı: nasıl de...
Raylar ile kullanarak yazı varlık boru...
görüntüleri önceden derlenmiş değil sa...