3.1.0 ActionView :: Şablon :: Hata (application.css önceden derlenmemiş)


281

Bir dizin fonksiyonu ile basit bir sayfa denetleyicisi ile temel raylar uygulaması yaptım ve sayfayı yüklediğimde:

ActionView::Template::Error (application.css isn't precompiled):
    2: <html>
    3: <head>
    4:   <title>Demo</title>
    5:   <%= stylesheet_link_tag    "application" %>
    6:   <%= javascript_include_tag "application" %>
    7:   <%= csrf_meta_tags %>
    8: </head>
  app/views/layouts/application.html.erb:5:in `_app_views_layouts_application_html_erb__43625033_88530400'

Gemfile

source 'http://rubygems.org'

gem 'rails', '3.1.0'

# Bundle edge Rails instead:
# gem 'rails',     :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'

gem 'execjs'
gem 'therubyracer'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', "  ~> 3.1.0"
  gem 'coffee-rails', "~> 3.1.0"
  gem 'uglifier'
end

gem 'jquery-rails'

# Use unicorn as the web server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end

7
exec rake varlıkları paketle: precompile bunu düzeltiyor gibi görünüyor, ama neden sadece çalışmıyor?
Chris Muench

10
Üretimde aynı sorunla karşılaşıyorum, hatta paket yürütme komisyon varlıklarını çalıştırdıktan sonra bile: precompile
Lucas Renan

Yanıtlar:


313

Varsayılan olarak Rails, dosyalarınızı üretim ortamında önceden derlediğinizi varsayar, üretimde canlı derleme kullanmak istiyorsanız (çalışma sırasında varlıklarınızı derleyin) config.assets.compile öğesini true olarak ayarlamanız gerekir .

# config/environments/production.rb
...
config.assets.compile = true
...

Önceden derlenmiş varlıklar kullanırken Sprockets'e geri dönmek için bu seçeneği kullanabilirsiniz, ancak önceden derlenmiş eksik dosyalar vardır.

Eğer config.assets.compileseçenek false olarak ayarlanır ve eksik dosyanın adını belirten bir "AssetNoPrecompiledError" alacak eksik önceden derlenmiş dosyalar vardır edilir.


3
Bu makalenin söylediklerini denemek isteyebilirsiniz: devcenter.heroku.com/articles/rails31_heroku_cedar (Henüz denemedim)
Chris Muench

7
Açık olmak gerekirse, config.assets.compile seçeneği config / environment / production.rb dosyasındadır (üretimde çalışıyorsanız). Ve üretimde canlı / tembel derleme yapabilmek istiyorsanız, application.rb'de tembel derlemeyi de etkinleştirmeniz gerekir.
avioing

34
Aldığımız performans isabeti nedeniyle çalışma zamanı derlemesini etkinleştirmek çözüm değildir. Çözüm, varlık ön derlemesinin oluşmasını önleyen temel sorunu düzeltmektir.
David Tuite

5
Varlıkları RAILS_ENV = üretim paketi exec rake varlıkları kullanarak önceden derledim: precompile. Neden bu hatayı alıyorum ve bu bayrağı da ayarlamam gerekiyor?
Tony

2
@Tony, çünkü muhtemelen application.css / js / image dosyasından başka bir şey istediniz ve kaydetmediniz application.rb. İçin / düzenlemek ekleyin application.rb: config.assets.precompile += %w( first.css second.js ). Şimdi bu dosyalar da derlenecek. Tüm dosyaları yalnızca zincir dişlilerinde kullanıyorsanız eklemeyin require, ancak yalnızca <link>/<script>
elado

202

Config.assets.compb öğesini production.rb dosyasında false olarak ayarlar ve varlıklarınızı önceden derlerseniz, üretimde daha iyi performans elde edersiniz. Bu komisyon göreviyle önceden derleyebilirsiniz:

bundle exec rake assets:precompile

Capistrano kullanıyorsanız, 2.8.0 sürümü dağıtım sırasında bunu gerçekleştirmek için bir reçete içerir. Daha fazla bilgi için Varlık Boru Hattı Kılavuzunun "Üretimde" bölümüne bakın: http://guides.rubyonrails.org/asset_pipeline.html


14
Bunu nasıl yapacağımı öğrenmenin ne kadar zor olduğuna inanamıyorum.
derekerdmann

3
Bu açıkça daha iyi bir seçenek gibi görünüyor: canlı derlemeyi true olarak ayarlamak "daha fazla bellek kullanır, varsayılandan daha kötü performans gösterir ve önerilmez." guides.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell

rake -Tya bundle exec rake -Tda arkadaşın.
Ryan

2
@Underworld Bundler yakut bir uygulamada mücevher bağımlılıklarını yönetmek için bir araçtır ve Rails 3 içine yerleştirilmiştir. Bundler kullanıyorsanız, koşmak bundle exec rake ...uygulamanız için doğru tırmık ve ilgili bağımlılıkları yüklediğinizden emin olacaktır. Bundler kullanmıyorsanız, sadece çalışacaksınız rake ....
richardsun

3
Yukarıdaki komutu çalıştıracaksanız, ortamınızı zaten üretim moduna ayarladığınızdan emin olun veya komutun önüne RAILS_ENV = production
JESii

31

Tamam - ben de aynı problemi yaşadım. "Config.assets.compile = true" kullanmak istemedim - Tüm .css dosyalarımı config / environment / production.rb içindeki listeye eklemek zorunda kaldım:

config.assets.precompile += %w( carts.css )

Sonra tmp / restart.txt oluşturmak (ve daha sonra silmek) gerekiyordu

Sürekli olarak stylesheet_link_tag yardımcısını kullandım, bu yüzden eklemek için gereken tüm ekstra css dosyalarını buldum:

find . \( -type f -o -type l \) -exec grep stylesheet_link_tag {} /dev/null \;

Farklı çözünürlükler için medya sorguları ve farklı css dosyaları kullanıyorsanız, bu en iyi yoldur.
Fa11enAngel

1
Tüm css dosyaları diziye dahil etmek zorunda? 40 css dosyam varsa ne olur?
yozzz

30

Capistrano kullanıcısı için hızlı bir düzeltme, bu satırı Capfile'a koymaktır

# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'

11

Bunu okuyan ancak bununla ilgili application.cssözel CSS sınıflarıyla veya bununla ilgili sorunu olmayan herkes için admin.css,base.css vb.

Çözüm belirtildiği gibi kullanmaktır

bundle exec rake assets:precompile

Ve stil sayfaları referanslar sadece referans application.css

<%= stylesheet_link_tag    "application", :media => "all" %>

Varlıklar boru hattı, application.css dosyasındaki tüm stil sayfalarınızı önceden derleyeceğinden. Bu aynı zamanda geliştirme aşamasındadır, bu nedenle varlıklar boru hattı kullanılırken başka referansların kullanılması yanlıştır.


8

Geliştirme ortamımda da aynı hatayla karşılaşıyordum. Sonunda düzeltmek için yapmanız gereken tek şey eklemek oldu:

config.assets.manifest = Rails.root.join("public/assets")

benim config / environment / development.rb dosyasına düzeltti ve düzeltildi. Varlıklarla ilgili gelişimdeki son yapılandırmam şöyle:

config.assets.compress = false  
config.assets.precompile += %w[bootstrap-alerts.js] #Lots of other space separated files
config.assets.compile = false
config.assets.digest = true
config.assets.manifest = Rails.root.join("public/assets")
config.assets.debug = true

Benim için işe yarayan tek çözüm buydu. Belki de Rails (3.1.3) sürümümle ilgili bir problemdi? Her neyse, varlıklarımın kamuya / varlıklara başarıyla derlendiğini ve dosya adlarının manifest.yml'de listelenen SHA'lara sahip olduğunu söyleyebilirim. Nedense, kurulumum her zaman daha önce iyi çalışmış olsa da, Rails artık doğru yerde varlık aramıyordu. Bu değişiklik bunu düzeltti.
antinome

Bu çözüm için teşekkürler. Geliştirme modunda bazı şeyleri test etmeye çalışıyordum ve zaten önceden derlenmiş varlıkları ve public / asset / application.css dizinde mevcut olmasına rağmen "application.css önceden derlenmedi" dediğine şaşırdım. Üretimde yaptıkları gibi otomatik olarak sizin için otomatik olarak config.assets.manifest ayarlamıyorlardı.
Tyler Rick

5

Ayrıca, önceden derlemeden üretimde çalışmaya çalışmanın, önceden derlenmemiş hataları atmaya çalıştığı bu sorunu yaşadım. Hangi satırı application.rb yorumladı değiştirmek zorunda kaldı:

  # If you precompile assets before deploying to production, use this line
  # Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  Bundler.require(:default, :assets, Rails.env)

2
Sadece daha sonra karşılaşan herkes için açıklığa kavuşturmak istiyorum, yukarıda değiştirmeniz gereken kodconfig/application.rb
GMA

4

İşte hızlı düzeltme:

Capistrano kullanıyorsanız bunu deploy.rb dosyasına ekleyin:

after 'deploy:update_code' do
  run "cd #{release_path}; RAILS_ENV=production rake assets:precompile"
end

kapak dağıtımı


2

Bugün bu hata mesajıyla karşılaştım ve çözümü özel durumuma göndermek istedim. Benim sorunum css dosyalarımdan biri kapanış ayracı eksik olduğu ve bu dosyanın derlenmemesine neden olduğu ortaya çıktı. Üretim ortamınız için her şeyi (varlık derleme dahil) ayarlayan otomatik bir işleminiz varsa bunu fark etmek daha zor olabilir.


1

Her şey başarısız olduktan sonra ...

Benim çözümüm yerleşim dosyasını

= stylesheet_link_tag "reset-min", 'application'

için

= stylesheet_link_tag 'application'

Ve işe yaradı! (Sıfırlama dosyasını manifestin içine koyabilirsiniz.)


1

Bunu Heroku'da düzeltmenin başka bir yolu: Rakefile'ınızın kararlı ve itilmiş olduğundan emin olun.


0

Heroku sunucusunda (salt okunur dosya sistemi), css'nin çalışma zamanı derlemesini istiyorsanız (önerilmez, ancak bunu yapabilirsiniz), aşağıdaki gibi ayarları yaptığınızdan emin olun -

# inside config/application.rb
config.assets.enabled = true
config.assets.prefix = Rails.root.join('tmp/assets').to_s

# If you are using sass then keep gem outside of asset group
 gem 'sass-rails',   '3.1.4'

# inside config/environments/production.rb
config.assets.compile = true

0

Her şeyi iyi takip ettiğinizi ama hala şanssız olduğunu düşünüyorsanız, / capistrano touch tmp / restart.txt veya eşdeğerini çalıştırdığınızdan emin olun. Şanssızlar listesindeydim ama şimdi :)


0

Muhtemelen syntax errorkullandığınız css bir var.

Bu komutu çalıştır

$ bundle exec rake assets:precompile RAILS_ENV=development --trace

İstisna verecek, düzeltti ve hepiniz bitti.

Teşekkürler

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.