Raylar 4: üretimde yüklenmeyen varlıklar


116

Uygulamamı üretime sokmaya çalışıyorum ve görüntü ve css varlık yolları çalışmıyor.

İşte şu anda yaptığım şey:

  • Görüntü varlıkları /app/assets/images/image.jpg içinde bulunur
  • Stil sayfaları /app/assets/stylesheets/style.css içinde bulunur
  • Düzenimde css dosyasına şu şekilde referans veriyorum: <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
  • Tek boynuzlu atı yeniden başlatmadan önce çalıştırıyorum RAILS_ENV=production bundle exec rake assets:precompileve başarılı oluyor ve public/assetsdizinde parmak izli dosyaları görüyorum .

Siteme göz attığımda, için 404 bulunamadı hatası alıyorum mysite.com/stylesheets/styles.css.

Neyi yanlış yapıyorum?

Güncelleme: Düzenimde şöyle görünüyor:

<%= stylesheet_link_tag    "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag    "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

Oluşturulan kaynak şudur:

<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>

Görünüşe göre Rails derlenmiş css dosyalarını düzgün bir şekilde aramıyor. Ancak javascripts için neden doğru çalıştığı çok kafa karıştırıcı ( /assets/****.jsyola dikkat edin ).


Bize css dosyanızı nasıl yüklediğinizi anlatır mısınız? Sizin hatanızdan kullanmak yerine sabit bağlamayı denediğiniz anlaşılıyor stylesheet_link_tag.
kik

1
Yukarıda yeni eklendi. Ben yapıyorum<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
emersonthis

Tamam, bu yüzden iki şeyi tavsiye ederim: 1. Üretilen kaynağı bu satırın yolu olarak yazıldıysa public/assetskontrol edin ve 2. o css dosyasını yüklemeye çalışan başka bir talimat olup olmadığını iki kez kontrol edin (muhtemelen sabit kodlanmış)
kik

.Erb kullanmanın bir sorun olup olmadığını söyleyemem çünkü bunu asla yapmıyorum: .home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }aslında sprocket ile değiştirilebilir .home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }. Belki bunun yardımı dokunursa deneyebilirsin.
kik

Bu referansı css dosyamda .erb uzantısını eklemeden dinamik yapabileceğimi mi söylüyorsunuz? Bunu değiştirdim çünkü geliştirme modundayken bağlantının kopmasını istemedim.
emersonthis

Yanıtlar:


105

Raylarda 4 aşağıdaki değişiklikleri yapmanız gerekir:

config.assets.compile = true
config.assets.precompile =  ['*.js', '*.css', '*.css.erb'] 

Bu benim için çalışıyor. varlıkları önceden derlemek için aşağıdaki komutu kullanın

RAILS_ENV=production bundle exec rake assets:precompile

İyi şanslar!


11
Config.assets.compile'ı true olarak ayarlamanın üretimdeki performansı öldüreceğini düşündüm. ayrıca, css.erb? bunu kim kullanıyor? peki ya sass ve kahve?
ahnbizcad

coffee ve sass dosyaları istendiğinde, coffee-script ve sass-rails gems tarafından sağlanan işlemciler tarafından işlenir ve ardından sırasıyla JavaScript ve CSS olarak tarayıcıya geri gönderilir.
Rameshwar Vyevhare

1
Bu sorun Rails 4 için zaten çözüldü ve bu nedenle turbo-sprocket-
rails3

4
Üzgünüm, sorumu cevaplamak için söylediklerinizle bağlantı kuramıyorum.
ahnbizcad

1
Normalde, üretim sunucusunu çalıştırdığınızda, Rails'i Apache veya nginx web sunucusunun arkasında yolcu veya tek boynuzlu at veya puma ile çalıştıracaksınız. Apache veya nginx'in statik dosyalar (js, css, resimler) ve Rails uygulama sunucusunun (puma, tek boynuzlu at) Rails kodu ve şablonu sunmasına izin vermek daha iyidir. Bunu yapmak için, config.serve_static_filesApache ve nginx'teki takma adı kapatmalı ve yapılandırmalısınız assets.
Châu Hồng Lĩnh

85

Aynı sorunu yaşadım ve bu ayarı config / environment / production.rb'de buldum:

# Rails 4:
config.serve_static_assets = false

# Or for Rails 5:
config.public_file_server.enabled = false

trueÇalışması için değiştiriliyor . Görünüşe göre Rails, ön uç web sunucunuzu Rails uygulamasına proxy yapmak yerine ortak klasör dışındaki dosyalara yönelik istekleri işleyecek şekilde yapılandırmış olmanızı bekliyor. Belki bunu javascript dosyalarınız için yaptınız, ancak CSS stil sayfalarınız için yapmadınız?

( Rails 5 belgelerine bakın ). Yorumlarda belirtildiği gibi, Rails 5 ile RAILS_SERVE_STATIC_FILESvarsayılan ayar olduğu için ortam değişkenini ayarlayabilirsiniz config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?.


1
KULLANIMDAN KALDIRMA UYARISI: Yapılandırma seçeneği config.serve_static_assets, config.serve_static_filesrolünü açıklığa kavuşturmak için yeniden adlandırıldı (yalnızca publicklasördeki her şeyin sunulmasını sağlar ve varlık ardışık düzeniyle ilgisi yoktur). Diğer serve_static_assetsad, Rails 5.0'da kaldırılacaktır. Lütfen yapılandırma dosyalarınızı uygun şekilde taşıyın.
yekta

Daha önce bu problemle karşı karşıya olduğumda, bu çizgiyi değiştirmek benim için çözmüştü, ama şimdi tekrar karşı karşıya geliyorum (bu gibi durumlara nasıl devam ettiğimi bilmiyorum) ve bu yeterli değil. Neyin yanlış olabileceğine dair başka bir öneriniz var mı?
IIllIIll

2
Kabul edilen cevap bu olmalıdır. config.serve_static_filesRails 4.2 ve config.public_file_server.enabledRails 5'te olmasına rağmen . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/…
Lucas Nelson

3
Rails 5.0.0.1 config / environment / production.rb içerir, config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?böylece SCM'nize eklenen kodu değiştirmeden ortamınız için bunu farklı şekilde ayarlayabilirsiniz.
tobinjim

Bunu etkinleştirmek için: "ihracat RAILS_SERVE_STATIC_FILES =" o zaman "küpeşte ler -e üretimini" çalıştırmak Devre dışı bırakmak için: "kurulmamış RAILS_SERVE_STATIC_FILES"
Alfredo Osorio

32

Bunu /config/environments/production.rbeklemek zorunda kaldım:

Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

.Js zaten önceden derlenmişti, ancak yine de ekledim. Görünüşe göre .css ve .css.erb otomatik olarak gerçekleşmiyor. , ^[^_]Parçaların derlenmesini engeller - bu bir normal ifade.

Dokümanların varlık ardışık düzeninin varsayılan olarak etkinleştirildiğini açıkça belirtmesi ancak javascript'ler için geçerli olan gerçeği netleştirmemesi biraz sinir bozucu.


Config.assets.precompile'a styles.css eklemeniz gerekiyor
Frederick Cheung

23

: Ben değiştirerek bu sorunu çözmek başardı config.assets.compile = falseiçin
config.assets.compile = truein/config/environments/production.rb

Güncelleme (24 Haziran 2018) : Kullandığınız Sprockets sürümü 2.12.5, 3.7.2 veya 4.0.0.beta8'den azsa bu yöntem bir güvenlik açığı oluşturur.


7
Bu, Rails'in varlıkları örneğin bir CDN'den yüklemek yerine derlediği anlamına gelmiyor mu?
Benjamin Oakes

@BenjaminOakes Evet, istediğim
buydu

2
Bu mod daha fazla bellek kullanır, varsayılandan daha kötü performans gösterir ve önerilmez. Bir nginx proxy kullanmak daha iyidir.
yekta

16

Rails 5 için aşağıdaki yapılandırma kodunu etkinleştirmelisiniz:

config.public_file_server.enabled = true

Varsayılan olarak, Rails 5 şu yapılandırma satırıyla gönderilir:

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

Bu nedenle, ortam değişkenini RAILS_SERVE_STATIC_FILEStrue olarak ayarlamanız gerekecektir .


1
Rails 5 için, passenger_env_var RAILS_SERVE_STATIC_FILES true;nginx.conf dosyamda uygulamamın konum bloğunu eklemeliyim.
Martin Velez

10

Üretimdeki varlıklara hizmet vermek için başarmanız gereken 2 şey vardır:

  1. Varlıkları önceden derleyin.
  2. Sunucudaki varlıkları tarayıcıya sunun.

1) Varlıkları önceden derlemek için birkaç seçeneğiniz vardır.

  • rake assets:precompileYerel makinenizde çalıştırabilir , kaynak kod kontrolüne (git) işleyebilir, ardından dağıtım programını çalıştırabilirsiniz, örneğin capistrano. Bu, önceden derlenmiş varlıkları SCM'ye kaydetmenin iyi bir yolu değildir.

  • RAILS_ENV=production rake assets:precompileSunucuyu yeniden başlatmadan önce, Rails uygulamanızı üretime her dağıttığınızda hedef sunucularda çalışan bir komisyon görevi yazabilirsiniz .

Kapistrano için bir görevdeki kod şuna benzer görünecektir:

on roles(:app) do
  if DEPLOY_ENV == 'production'
    execute("cd #{DEPLOY_TO_DIR}/current && RAILS_ENV=production rvm #{ruby_string} do rake assets:precompile")
  end
end

2) Artık üretim sunucularında varlıklar var, onları tarayıcıya sunmanız gerekiyor.

Yine, birkaç seçeneğiniz var.

  • Config / environment / production.rb'de Rails statik dosya sunumunu açın

    config.serve_static_assets = true # old
    
    or
    
    config.serve_static_files = true # new

    Statik dosyaları sunmak için Rails kullanmak, Rails uygulamanızın performansını öldürecektir.

  • Statik dosyalar sunmak için nginx'i (veya Apache'yi) yapılandırın.

    Örneğin, Puma ile çalışacak şekilde yapılandırılan nginx'im şöyle görünür:

    location ~ ^/(assets|images|fonts)/(.*)$ {
        alias /var/www/foster_care/current/public/$1/$2;
        gzip on;
        expires max;
        add_header Cache-Control public;
    }

4

Rails 4 artık varlığın parmak izi olmayan sürümünü oluşturmuyor: stylesheets / style.css sizin için oluşturulmayacak.

Eğer kullanırsanız stylesheet_link_tagdaha sonra stil sayfasına doğru bağlantı oluşturulur

Ek styles.cssolarak config.assets.precompile, önceden derlenmiş şeylerin listesi olmalıdır


/ Public / assets / dizininde parmak izli dosyayı görüyorum. <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
Düzenimde

Bazı nedenlerden dolayı, kaynağı görüntülediğimde üretim dağıtımı hala orijinal dosyalara işaret ediyor <link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />Ancak javascript dosyaları doğru! Neden aynı yapılandırmaların .js dosyaları için işe yaradığını ama .css için işe yaramadığını anlamıyorum.
emersonthis

Rails 5.0.0.beta3'te şu uyarıyı alıyorum: DEPRECATION WARNING: serve_static_fileskullanımdan kaldırıldı ve Rails 5.1'de kaldırılacak. Lütfen public_file_server.enabled = truebunun yerine kullanın.
GMA

@emersonthis Aynı! Js mükemmel bir şekilde yükleniyor, ancak bazı css dosyaları 404. Bunu çözdün mü?
IvRRimUm

Neredeyse HER ZAMAN varlık ardışık düzeni yapılandırmasıyla ilgili bir sorundur. Varsayılan olmayan herhangi bir konumda dosyalarınız varsa, neredeyse kesinlikle sorun budur ve varlık hattına ilk cevap gibi bir şey kullanarak bunu söylemeniz gerekir.
emersonthis

3

Production.rb dosya satırınızı değiştirin

config.assets.compile = false

içine

config.assets.compile = true

ve ayrıca ekle

config.assets.precompile =  ['*.js', '*.css', '*.css.erb']

neden derleyelim? üretim devam ederken derleme yapmamız gerekmiyor
James Tan

1
BUNU ASLA YAPMA! Üretimde config.assets.compile'ı true olarak ayarlayan herkes çekilmelidir.
bkunzi01

2

Koşuyorum Ubuntu Sunucu 14.04 , Ruby 2.2.1 ve 4.2.4 Raylar ben takip ettim bir dağıtmak turorial DigitalOcean gelen ve her şey iyi gitti ama tarayıcısına gidip benim VPS benim app IP adresini girdiğinizde olmadan yüklenir ancak stiller ve javascript.

Uygulama Unicorn ve Nginx ile çalışıyor . Bu sorunu çözmek için sunucuma SSH kullanarak 'dağıtıcı' kullanıcımla girdim ve '/ home / deployer / apps / blog' olan uygulama yoluma gittim ve aşağıdaki komutu çalıştırdım:

RAILS_ENV=production bin/rake assets:precompile

Sonra sadece VPS'yi yeniden başlatıyorum ve hepsi bu! Benim için çalışıyor!

Umarım başkası için yararlı olabilir!


2

Ön derleme ayarlanmışsa ihtiyacınız YOKTUR

config.assets.compile = true

varlıklara canlı olarak hizmet etmek olduğu için.

Bizim sorunumuz, yalnızca geliştirme gizli anahtar tabanımızın config/secrets.yml

development:
    secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'

Üretim ortamı için giriş gerekli


1
ihtiyacınız olan config.assets.precompile = ['*.js', '*.css', '*.css.erb'] ve RAILS_ENV=production bundle exec rake assets:precompile
koşmanız

1
bu, canlı yayın sırasında varlıkların derlenmesini sağlar, çok yavaş, doğru değil
James Tan

2

YAPMAMANIZ GEREKENLER:

Yukarıdaki meslektaşlarımdan bazıları bunu yapmanızı tavsiye etti:

config.serve_static_assets = true  ## DON”T DO THIS!! 
config.public_file_server.enabled = true ## DON”T DO THIS!!

Rayların varlık boru hattı yukarıdaki yaklaşımdan söz ediyor:

Bu mod daha fazla bellek kullanır, varsayılandan daha kötü performans gösterir ve önerilmez. Buraya bakın: ( http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation )

YAPMANIZ GEREKENLER:

Varlıklarınızı önceden derleyin.

RAILS_ENV=production rake assets:precompile

Bunu muhtemelen bir tırmık görevi ile yapabilirsiniz.


Gerçi neden git'e yapı eserleri ekleyelim? Sadece kendi inşa sürecine tırmık görev eklemek ve (Eğer uglifier ve üzerinde Gzip Sıkıştırma sahip olduğu yapmanız gerekir özellikle) masif gitspam önleyebilirsiniz
Dr.Strangelove

@ Dr.Strangelove Yorumunuz için teşekkür ederiz - bu konuda yeterince bilgim yok -: orijinal gönderiyi detaylandırabilir / düzenleyebilir misiniz?
BKSpurgeon

1

Dosyaları derlemek için varsayılan eşleştirici, mücevherleriniz dahil olmak üzere uygulama / varlıklar klasörlerinden application.js, application.css ve tüm JS / CSS olmayan dosyaları (bu, tüm görüntü varlıklarını otomatik olarak içerecektir) içerir:

Dahil edilecek başka bildirimleriniz veya bağımsız stil sayfalarınız ve JavaScript dosyalarınız varsa, bunları config / initializers / assets.rb içindeki ön derleme dizisine ekleyebilirsiniz:

Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets


1

Öncelikle varlıklarınızı kontrol edin, varlıkların önceden derlenmesinde bazı hatalar olabilir.

Üretim ENV'sindeki varlıkları önceden derlemek için şu komutu çalıştırın:

RAILS_ENV=production rake assets:precompile

Hata gösteriyorsa, önce onu kaldırın.

"Tanımlanmamış değişken" hatası durumunda, o değişken dosyasını başka bir dosyada kullanmadan önce yükleyin.

misal:

@import "variables";
@import "style";

application.rb dosyasında varlıkların ön derleme sırası

misal:

config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js']

config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']

1

Bunu buldum:

Yapılandırma seçeneği config.serve_static_assets, config.serve_static_filesrolünü netleştirmek için yeniden adlandırıldı .

içinde config/environments/production.rb:

# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

Bu nedenle, statik dosyaları sunmak için env RAILS_SERVE_STATIC_FILESveya use'u ayarlayın Nginx. Ekle config.serve_static_assets = trueçalışmaya devam edecek, ancak gelecekte kaldırılacaktır.


1

capistrano'nun varlıkları önceden derlemesine izin vermeniz tavsiye edilmez, çünkü bu işlem yaş alabilir ve çoğu zaman zaman aşımına uğrayabilir. yerel varlıkları önceden derlemeye çalışın.

Birincisi, config / application.rb içinde ayarlayın, config.assets.initialize_on_precompile = false sonra yerel yapın RAILS_ENV=production bin/rake assets:precompile ve bu public / varlıkları git'e ekleyin.

ve config / environment / development.rb, önceden derlenmiş varlıkları kullanmaktan kaçınmak için varlık yolunuzu değiştirin:

config.assets.prefix = '/dev-assets'

Eğer db bağlantı sorununuz varsa, db kullanan bir başlatıcıya sahip olduğunuz anlamına gelir. Bunun bir yolu, production.rb'yi belki production2 .rb olarak çoğaltarak yeni bir ortam ayarlamak ve database.yml'de, geliştirme db ayarı ile production2 ortamı eklemektir . o zaman yap

RAILS_ENV=production2 bin/rake assets:precompile

Varlıklarla ilgili bir sorunla karşılaşmaya devam ediyorsanız, örneğin ckeditor, js dosyasını config / initializers / assets.rb dosyasına ekleyin.

Rails.application.config.assets.precompile += %w( ckeditor.js )


0

Yanılıyor olabilirim ama değiştirmeyi önerenler

config.assets.compile = true

Bu satırdaki yorum şöyledir: # Önceden derlenmiş bir varlık eksikse varlıklar ardışık düzenine geri dönmeyin.

Bu, bunu doğru olarak ayarlayarak sorunu çözmediğinizi, bunun yerine onu atladığınızı ve her seferinde boru hattını çalıştırdığınızı gösterir. Bu kesinlikle performansınızı düşürmeli ve boru hattının amacını bozmalıdır?

Aynı hatayı aldım ve rayların bilmediği bir alt klasörde çalışan uygulamadan kaynaklanıyordu.

Yani benim css dosyam home / subfolder / app / public / .... içinde ama raylar home / app / public / ...

Uygulamanızı alt klasörün dışına taşımayı veya raylara bir alt klasörde olduğunu söylemeyi deneyin.


0
location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;
  add_header ETag "";
}

Bu benim için üretimdeki sorunu çözdü. Nginx yapılandırmasına koyun.


0

Hatta RAILS_ENV=production bundle exec rake assets:precompilebaşarılı olduğumuz yerde aynı problemle karşılaştık ama işler beklendiği gibi gitmedi.
Tek boynuzlu atın burada ana suçlu olduğunu bulduk.

Sizin durumunuzla aynı, varlıkları derledikten sonra tek boynuzlu atı yeniden başlatırdık. Tek boynuzlu at yeniden başlatıldığında, ana işlemin değil, yalnızca çalışan işlemlerinin yeniden başlatıldığı fark edildi.
Doğru varlıkların sunulmamasının ana nedeni budur.

Daha sonra, varlıkları derledikten sonra, tek boynuzlu atı durdurduk ve başlattık, böylece tek boynuzlu at ana süreci de yeniden başlatıldı ve doğru varlıklar sunuldu.
Tek boynuzlu atı durdurmak ve başlatmak, tek boynuzlu atı yeniden başlatmakla karşılaştırıldığında, kesinti süresine yaklaşık 10 saniye getirir. Bu, uzun vadeli çözümün tek boynuzlu attan puma'ya taşınması durumunda kullanılabilecek geçici çözümdür.

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.