2012-07-15 27 views
10

'da varlık önceliğini devre dışı bırakın Rails'te temkinli varlık precompile'ını gerçekleştirmek için çeşitli kıvrımlı ve genellikle etkisiz çözümler gördüm. Bir arka uç geliştirici olarak, programın her açılışında asla dokunmadığım varlıkları yeniden derlemek istemiyorum, ancak varlıklar load 'deploy/assets' aracılığıyla aracılığıyla yüklenir ve deploy.rb'daki bir görevi tanımlayarak değil, bir yolu düşünemiyorum. koşullu olarak devre dışı bırakın.Koşullu olarak Capistrano

Kullandığım davranış, düzenli ön dağıtım dağıtımı için cap deploy ve varlık dağıtımını atlamak için cap deploy:no_assets kullanmaktır.

cevap

7

rails4, bu sorunu, yalnızca değişmiş varlıkları önceden derleyerek, yeni sürümleriyle birlikte sunar. Bu arada, rails3 uygulamalarınız için turbo-sprockets-rails3 gem'i öneririm.

Bu taş

sorun zaten rails4 ele çünkü master birleştirilecek değildi Nathan Broadbent tarafından sprockets-rails için set of patches olarak başladı.

  • sizin Rails 3 tırmık varlıklar hızlandırır: README itibaren kendi kaynak dosyalarının bir hash dayalı, sadece değiştirilen yeniden derlenmesine varlıklar tarafından precompile

  • Sadece hem parmak ve sivil üretmek için bir kez derler -fingerprinted varlıklar

Ve:

turbo-sprockets-raylar3, en son Capistrano sürümüyle kutunun dışında çalışmalıdır.

Capistrano ile konuşlandırılan raylar-3.2.x uygulamalarında benim için iyi çalıştığını doğrulayabilirim.

GitHubbers için bir yan not olarak, orijinal pull request, birleştirilmemiş olsa bile açık kaynak projeye kod gönderme konusunda mükemmel bir örnektir.

+1

Sadece buna kendim geçiş yaptım ve harika olduğunu kanıtlayabilir! – RubberDucky

+2

Rails 4.0'ım var ve hiçbir varlığı değiştirmiyorum ama her şeyi sıfırdan yeniden derler. Herhangi bir fikir? – scaryguy

1

Bu özü herhangi %w(app/assets lib/assets vendor/assets Gemfile.lock config/routes.rb) değişiklikler ve eğer öyleyse, sadece precompiles sonra varsa hemen görmek için son dağıtmak adresinin git günlüğünü denetler https://gist.github.com/3072362

çok umut verici görünüyor.

+0

Önceden bu benzerini yükledim, ancak buna benzer bir etkisi yok gibi görünüyor. Yükümdeki "deploy/assets" öğesini bıraksam, gerekmediğinde precompile işlemini durdurmaz. Eğer 'load' konuşlandırma/varlıkları 'çıkarırsam, ihtiyaç duyduğu zaman bile önceden derleme yapmaz. Kod güncellemesinden sonra tetiklemek için ek bir tetikleyici ile bile. – RubberDucky

+0

Yapılandırma/deploy.rb dosyanızda bu öznitelik gerektirmediğini düşünüyorum. Dağıtımın üzerine yazar: varlıklar: precompile task. Capfile ''deploy/assets' 'yükleyiniz. –

+0

Bu, turbo sporoket raylardan hala daha hızlıdır, çünkü tüm kontrolü atlar, bu da benim için dakikayı alır. – lulalala

14

Her iki turbo-sporoket rayları ve bu otomatik atlama komut dosyalarının bazı tuzakları vardır (daha sonra bahsedeceğim). Bu yüzden aşağıdaki kesmek kullanmak, bu yüzden benim iradesiyle varlık precompile atlamak için bir parametre iletebilirsiniz:

callback = callbacks[:after].find{|c| c.source == "deploy:assets:precompile" } 
callbacks[:after].delete(callback) 
after 'deploy:update_code', 'deploy:assets:precompile' unless fetch(:skip_assets, false) 

Bu komut yerleşik varlık-ön derleme kanca değişecek, bu nedenle bağımlısı dayalı olacak skip_assets parametresi. Varlık precompile'ını bir bütün olarak atlamak için cap deploy -S skip_assets=true numaralı telefonu arayabilirim.

Bana göre, turbo sporoket rayları, hiçbir şey değişmediğinde denetimi yapmak için birkaç dakika alır.Bu, bir düzeltmeyi sunucuya en kısa zamanda göndermem gerektiğinde çok önemli olabilir. Bu yüzden benim zorlama yöntemine ihtiyacım var.

+0

Çalışması için bu kodu tam olarak nereye ekliyorsunuz? –

+0

@dtmunir Deploy.rb dosyasının sonuna ekledim. – lulalala

+0

Bu harika bir çözümdür. Capistrano 2 ile Rails 4 uygulamasında hala çalışıyor. Sadece 'konuşlandır: varlıklar: precompile' ile zincirlenmiş başka işleriniz yoksa veya onlar da atlanacaklar. –