Heroku kompiliert KEINE Dateien unter Assets-Pipelines in Rails 4

77

Auf der lokalen Maschine mit der Assets-Pipeline in Rails 4 und Ruby 2.0 läuft alles gut. Bei der Bereitstellung auf Heroku wird jedoch Folgendes gezeigt:

-----> Preparing app for Rails asset pipeline
   Running: rake assets:precompile
   I, [2013-03-12T03:28:29.908234 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/rails-2ee5a98f26fbf8c6c461127da73c47eb.png
   I, [2013-03-12T03:28:29.914096 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/trash-3c3c2861eca3747315d712bcfc182902.png
   I, [2013-03-12T03:28:33.963234 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-bf2525bd32aa2a7068dbcfaa591b3874.js
   I, [2013-03-12T03:28:40.362850 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-13374a65f29a3b4cea6f8da2816ce7ff.css
   Asset precompilation completed (14.36s)

Heroku scheint Dateien zu kompilieren, legt sie jedoch fehlerfrei in / tmp ab. Meine Fragen sind:

  1. Wie kommt es, dass Heroku Assets-Dateien nach / tmp kompiliert?
  2. Meine letzte Lösung bestand darin, RAILS_ENV = Produktionspaket-Exec-Rake-Assets auszuführen: lokal vorkompilieren, aber dies erzeugte eine manifest-xxxxxx.json in public / assets anstelle von manifest.yml, sodass heroku die JSON-Manifestdatei nicht erkennt. Ich habe es durch manuelles Erstellen eines Yml aus der JSON-Datei aussortiert und Heroku wurde glücklich. Wurde Herokus Ansatz veraltet?
Aquajach
quelle
1) jemand untersucht dies
Katzen am
2) das sich in Schienen 4 geändert hat, gibt es eine Pull-Anfrage an das Buildpack, um es zu aktualisieren
Catsby
@ctshryock irgendwelche Updates dazu?
Tadas T
Es gibt github.com/heroku/heroku-buildpack-ruby/pull/74 für das Manifest-Problem. Ich werde die Leute heute wegen des / tmp / -Problems nerven, was immer noch passiert, oder?
Catsby
@ctshryock Ja, leider passiert es immer noch ... Danke für den richtigen Beitrag ...
Boti

Antworten:

102

Herokus Asset-Plugins funktionieren nicht mehr, da Rails 4 keine Plugins unterstützt. Sie müssen stattdessen Herokus Edelsteine ​​verwenden. Legen Sie dies in Ihre Gemfile:

group :production do
  gem 'rails_log_stdout',           github: 'heroku/rails_log_stdout'
  gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'
end

Folgen Sie Herokus Anleitung , um mit Rails 4 zu beginnen.

Update (22.07.2013): Heroku liefert jetzt ein anderes Juwel zum Vorkompilieren von Assets.

group :production do
  gem 'rails_12factor'
end
Joseph Ravenwolfe
quelle
14
Das war für mich nicht nötig. Musste einfach @Israel Barba Antwort auf Änderung folgen config.serve_static_assets = falsezu true.
Matt De Leon
2
Ich hatte es zuvor so gemacht, aber ich glaube, wenn Sie es so machen, müssen Sie die Assets vorkompilieren und selbst festlegen. Ist das noch richtig?
Joseph Ravenwolfe
Es funktionierte ohne Vorkompilierung. Es kann ein Szenario geben, in dem es nicht funktioniert, das ich nicht fange (ich hatte nur ein einfaches Stylesheet)
Matt De Leon
2
Das funktioniert nicht. Vorkompilierung auch nicht. Für uns ist die Asset-Pipeline auf Heroku für Rails 4 unterbrochen und wir haben viel Zeit verschwendet, zurück zu ec2 - murren murren.
Joshua Kolden
4
Verwenden Sie den Asset_path () - Helfer in Ihrem CSS und anderswo? Das Referenzieren von Assets über "/assets/filename.jpg" funktioniert auch unter Heroku nicht.
Joseph Ravenwolfe
33

Sie müssen Rails konfigurieren, um statische Assets in der Produktion bereitzustellen: config / environment / Production.rb

SampleApp :: Application.configure do
  .
  .
  .
  config.serve_static_assets = true
  .
  .
  .
Ende

AKTUALISIEREN:

In Rails 4 ist veraltet und wurde geändert durch:

config.serve_static_files = true 
Israel Barba
quelle
1
Ich musste auch meinen öffentlichen / Assets-Ordner entfernen, da diese lokal von jemand anderem in meinem Team vorkompiliert, in GitHub eingecheckt und Herokus Asset-Kompilierungsprozess überschrieben wurden.
user1515295
16

Da Rails 4 manifest.yml durch manifest- (Fingerabdruck) .json ersetzt hat , möchten Sie die Bereitstellung statischer Assets aktivieren.

Von den ersten Schritten mit Rails 4.x auf Heroku :

gem 'rails_12factor', group: :production

dann

bundle install

und schlussendlich,

git push heroku

Das Problem wurde für mich behoben. Hoffe das hilft!

voss
quelle
1
Das sagen sie im offiziellen Dokument, aber funktioniert es auch für andere? Ich hatte dies auf meiner Gemfile und die Javascript-Dateien schienen immer noch nicht vorkompiliert zu sein
Maximus S
1
Ich habe alles getan: gem 'rails_12factor', Gruppe :: Produktion config.serve_static_assets = true config.assets.precompile + =% w (* .css * .js) Ich habe meine js- und css-Dateien unter vendor / assets /. Wenn ich auf Heroku bereitstelle, sieht alles gut aus: Ausführen: Rake-Assets: Vorkompilieren Asset-Vorkompilierung abgeschlossen (310.44s) Wenn ich application-5c84e59d83c00fd13fb659edc18db24a.js sehe, ist alles leer. Wissen Sie, was ich falsch mache?
Alexander Giraldo
Das hat bei mir nicht funktioniert. config.serve_static_assets = truebedeutete, dass die CSS richtig zu bedienen begann, aber nicht die Bilder oder JS.
Alex Lynham
Das hat bei mir funktioniert, danke @voss für die aktualisierte Antwort. Heroku hat rails_log_std_out und rails3_serve_static_assets durch rails_12factor ersetzt.
Aaron Gray
Wie referenzieren Sie Ihre Bilder? Ich habe versucht, Hintergrundbild: URL ('/ public / Assets / Starsw600.jpg'); und nur ('starsw600.jpg'). Habe nicht alle Kombinationen mit config.serve_static_assets und ('starsw60xxxxxx.jpg) ausprobiert.
Flobacca
14

Ich stoße genau auf das gleiche Problem.

Ich setze config.serve_static_assets = true in meiner Datei environment / Production.rb, bis Heroku das neue Manifestformat nicht mehr unterstützt.

Es ist also eine zeitliche Lösung, bis die Heroku-Unterstützung hinzugefügt wird.

Boti
quelle
das funktioniert nicht Heroku fügt dies ein , das genau das tut: dh es wird nicht funktionieren, beste Lösung bisher: Kopieren Sie die Datei manifest.json in manifest.yml (keine Konvertierung erforderlich), um Heroku dazu zu bringen, vorkompilierte Assets zu erkennen.
Dakull
5
Wenn Sie statische Assets bereitstellen, funktioniert dies, jedoch nicht für alle Edelsteine, die über eigene Assets verfügen, z. B. Font Awesome oder HTML5 Boilerplate.
Joseph Ravenwolfe
@dakull, das funktioniert hat, dass es jetzt die JS-Dateien korrekt bereitstellt, aber die Hintergrundbildtexturen im app/assets/imagesVerzeichnis werden immer noch nicht bereitgestellt .
Alex Lynham
13

Nach stundenlangem Googeln, in dem mir keiner der Anleitungen zu Heroku oder die Vorschläge zu StackOverFlow geholfen haben, bin ich endlich auf diesen Blog-Beitrag gestoßen, der diesen Hinweis bot:

heroku labs:enable user-env-compile --app=YOUR_APP

Ohne dies versucht die Asset-Pipeline immer, die gesamte App zu initiieren und eine Verbindung zur Datenbank herzustellen (trotz all der Dinge, die Sie möglicherweise gelesen haben, dass Rails 4 dies jetzt länger tut). Dadurch wird Ihre Heroku-Konfiguration Rails ausgesetzt, sodass sie erfolgreich gestartet und Rake-Aufgaben wie Assets ausgeführt werden können: Vorkompilieren.

PatrickEm
quelle
Endlich etwas, das funktioniert hat. Diese Funktion sei experimentell und könne jederzeit entfernt werden.
tmartin314
10
"Keine solche Funktion: user-env-compile"
Andreas Baumgart
Es ist keine Laborfunktion mehr, sondern standardmäßig im Heroku-Stack enthalten. Dieser Befehl muss nicht mehr ausgeführt werden.
Chris Peters
7

Ich musste dieses Juwel benutzen:

gem 'rails_12factor', group: :production #need this for rails 4 assets on heroku

Und in /config/environments/production.rb musste ich Folgendes einstellen:

config.assets.compile = true

Mein Verständnis ist, dass der rails_12_factorEdelstein config.serve_static_assets = trueunter anderem setzt.

wuliwong
quelle
4

In meinem Fall wurden Assets gemäß den obigen Anweisungen kompiliert, aber es wurde nicht die Bootstrap-Glyphikon 'fontawesome-webfont' ausgewählt, sodass dies für mich endlich funktionierte, nachdem ich so viele Stunden recherchiert hatte.

Edelsteindatei

gem 'rails_12factor', group: :production

Bundle installieren

config / application.rb

config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif,
                                  "fontawesome-webfont.ttf",
                                 "fontawesome-webfont.eot",
                                 "fontawesome-webfont.svg",
                                 "fontawesome-webfont.woff")



config.assets.precompile << Proc.new do |path|
      if path =~ /\.(css|js)\z/
        full_path = Rails.application.assets.resolve(path).to_path
        app_assets_path = Rails.root.join('app', 'assets').to_path
        if full_path.starts_with? app_assets_path
          puts "including asset: " + full_path
          true
        else
          puts "excluding asset: " + full_path
          false
        end
      else
        false
      end
    end

Umwelt / Produktion.rb

config.serve_static_assets = true

Dann rannte ich endlich rake assets:precompile RAILS_ENV=productionund schob es zu Heroku und das funktionierte.

Syed Ehtsham Abbas
quelle
1
Ich glaube, der Rails_12-Faktor erledigt den Teil config.serve_static_assets.
Justingordon
3

Dies war ein Problem mit dem Heroku Ruby Buildpack, aber heute (21.05.2013) wurde ein Update bereitgestellt. Bitte probieren Sie es aus und lassen Sie es uns wissen.

So beantworten Sie Ihre Fragen:

# 1) Dies ist die Ausgabe der Kettenräder. Dinge werden kompiliert /tmpund dann verschoben (siehe hier in Kettenräder ). Meines Wissens wurde dies immer so gemacht, aber erst als die Sprockets-Version in Rails aktualisiert wurde, haben wir diese neue Ausgabe vom Typ Debug erhalten.

# 2) Früher assets:precompilewurde eine manifest.jsonDatei erstellt, jetzt enthält die Manifestdatei in Rails 4 einen Fingerabdruck, der zuvor nicht erkannt wurde. Dies wurde behoben mit # 74 .

Katzenby
quelle
2

Ich habe dies oben in einer meiner css.scss-Dateien im Ordner Assets / Stylesheets / hinzugefügt.

@import "font-awesome";

dann lief ..

rake assets:clean

und...

rake assets:precompile RAILS_ENV=production
Tuneyfish
quelle
2

In Rails 4.2.4 hat Ihre Production.rb die Zeile:

config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

Das bedeutet, gem 'rails_12factor', group: :production es muss nicht in true geändert werden, da es über die Heroku-Umgebungsvariablen festgelegt werden kann. Sie erhalten auch eine Warnung, wenn Sie den Edelstein rails_12factor entfernen.

Wenn Sie Probleme mit Assets haben , melden Sie sich bei der Heroku-Konsole an heroku run rails consoleund ermitteln Sie den Asset-Pfad für eine Dateiputs helper.asset_path("application.js") .

Ein seltsames Verhalten, das ich zwischen Entwicklung und Produktion festgestellt habe, als das Dateiende nicht angegeben wurde:

Bei einem Bild unterscheidet sich /assets/images/image_01.jpgdie folgende Ausgabe von asset_paths:

Entwicklung :

development > puts helper.asset_path('profile_01') 
=> /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg

development > puts helper.asset_path('profile_01.jpg') 
=> /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg

Produktion :

development > puts helper.asset_path('profile_01') 
=> /profile_01

development > puts helper.asset_path('profile_01.jpg') 
=> /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg

Sie müssen nicht ausgeführt werden RAILS_ENV=production rake assets:precompile, Heroku erledigt dies für Sie während der Bereitstellung. Außerdem müssen Sie die in der Entwicklung befindlichen Assets nicht vorkompilieren und an Heroku senden.

Neonmate
quelle
1

Abgesehen davon, dass Sie den Edelstein 'rails_12factor' installiert haben, müssen Sie nur Folgendes tun.

# config/application.rb

config.assets.paths << Rails.root.join('vendor', 'assets')

Obwohl Rails genau weiß, was es will, muss Heroku anscheinend daran erinnert werden, den Assets-Ordner als Teil der Assets-Pfade aufzunehmen.

Entwickeln
quelle
1

Verwenden Sie Bilderweiterungen

Ich hatte das gleiche Problem, aber aus einem anderen Grund.

Anstatt

<%= asset_path 'facebook-link' %>

Verwenden:

<%= asset_path 'facebook-link.png' %>

Während der erste vor Ort arbeitete, brachen meine Bilder, als ich zu Heroku drängte, und ich hatte keine Ahnung warum. Die Verwendung der vollständigen Dateierweiterung hat das Problem behoben :)

Phil
quelle
0

Wenn Sie Controller-spezifische Assets wie folgt verwenden:

 <%= javascript_include_tag params[:controller] %> or <%= javascript_include_tag params[:controller] %>

In der Produktion müssen Sie diese dann explizit vorkompilieren (in Entwicklungsschienen werden Dateien im laufenden Betrieb kompiliert).

Siehe den offiziellen Rails-Leitfaden hier: http://guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets

Zum Vorkompilieren, wie in den Handbüchern erläutert (hier: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets ), müssen Sie der Datei config / application.rb Folgendes hinzufügen

# config/application.rb
config.assets.precompile << Proc.new do |path|
  if path =~ /\.(css|js)\z/
    full_path = Rails.application.assets.resolve(path).to_path
    app_assets_path = Rails.root.join('app', 'assets').to_path
    if full_path.starts_with? app_assets_path
      puts "including asset: " + full_path
      true
    else
      puts "excluding asset: " + full_path
      false
    end
  else
    false
  end
end
Andrea
quelle
0

Ich denke, ich werde dies als Antwort hinzufügen, da diese Frage auf der Heroku-Support-Seite verlinkt ist, wenn Sie danach suchen "assets".

Dies ist hauptsächlich für Leute gedacht, die ihre App auf Rails 4 aktualisieren, aber nachdem ich diese - und viele andere SO-Beiträge - durchgesehen habe, habe ich Folgendes geändert production.rb:

config.action_dispatch.x_sendfile_header = "X-Sendfile"

Zu:

config.action_dispatch.x_sendfile_header = nil

Ich hatte dies beim Upgrade nicht bemerkt und wie immer brauchte ich ewig, um es herauszufinden. Hoffentlich hilft es jemand anderem! Rufen Sie PatrickEm an , der dasselbe in seiner Frage gefragt / beantwortet hat .

tvalent2
quelle
0

Dies beantwortet möglicherweise nicht die Grundursache der ursprünglichen Frage, aber ich hatte ein ähnliches Symptom mit einer anderen Grundursache.

Durch die Vorkompilierung einer JPEG-Datei wird die Dateierweiterung in JPG geändert, dh asset_path("my_image.jpeg")undasset_path("my_image") hat nicht funktioniert. Entfernen Sie das "e" aus JPEG und voila, es funktioniert.

Andere haben das gleiche Problem hier beschrieben: https://blazarblogs.wordpress.com/2016/04/06/rails-force-to-precompile-jpeg-to-jpg/

Ist das ein Fehler? Oder gewünschtes Verhalten? Und auch seltsam, dass es in meiner von Heroku gehosteten Produktionsumgebung nur nicht funktioniert. Vielleicht haben sie eine Art Konfiguration.

Anthony Wood
quelle