Heroku ne compile pas de fichiers sous assets pipelines in Rails 4

tout va bien dans la machine locale avec des actifs pipeline dans les Rails 4 et Ruby 2.0. Mais lors du déploiement à heroku, il est montré que:

-----> 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 semble compiler des fichiers, mais le mettre dans /tmp sans erreurs. Mes questions sont:

  1. comment se fait-il que Heroku compile des fichiers d'actifs vers /tmp?
  2. ma dernière solution était de faire fonctionner RAILS_ENV=production bundle exec rake assets: précompile local, mais ce généré un manifeste-xxxxxx.json dans public / assets, plutôt que manifeste.yml, pour qu'heroku ne détecte pas le fichier JSON. J'ai trié par créé manuellement un yml du fichier json et heroku est devenu heureux. L'approche d'heroku a-t-elle été dépassée?
77
demandé sur Manuel Pedrera 2013-03-12 10:14:37

16 réponses

les plugins d'Héroku ne fonctionnent plus car les Rails 4 ne supportent plus les plugins. Tu dois utiliser les gemmes d'Heroku à la place. Placez ceci dans votre 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

Suivre Heroku guide de l' sur la mise en route avec des Rails 4.

mise à jour (07/22/2013): Heroku fournit maintenant une gemme différente pour précompiler les actifs.

group :production do
  gem 'rails_12factor'
end
101
répondu Joseph Jaber 2013-07-22 16:21:46

vous avez besoin de configurer des Rails pour servir des actifs statiques dans la production: config/environnements/production.rb

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

mise à jour:

dans les Rails 4 est déprécié, et a été modifié par:

config.serve_static_files = true 
33
répondu Israel Barba 2015-03-13 19:08:19

depuis les rails 4 ont remplacé le manifeste.yml avec manifeste-(empreintes digitales).json , vous voudrez activer le service actif statique.

à Partir de débuter avec Rails 4.x sur Heroku :

gem 'rails_12factor', group: :production

puis

bundle install

et, enfin,

git push heroku

a réglé le problème pour moi. Espérons que cette aide!

16
répondu voss 2013-06-29 00:42:13

je tombe exactement sur le même problème.

j'ai mis config.serve_static_assets = true dans mes environnements / production.le fichier rb jusqu'à ce qu'heroku ne supporte pas le nouveau format de manifeste.

donc c'est une solution temporelle jusqu'à ce que le support heroku soit ajouté.

14
répondu Boti 2013-03-16 11:33:11

après des heures de googling dans lequel aucun des guides sur Heroku ou les suggestions sur StackOverFlow ne m'ont aidé, je suis finalement tombé sur ce billet de blog qui a offert cet indice:

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

sans cela, le pipeline asset tentera toujours d'initialiser l'application et de se connecter à la base de données (malgré tout ce que vous avez pu lire que les rails 4 font maintenant plus longtemps). Cela expose votre configuration Heroku à des Rails afin qu'elle puisse démarrer avec succès et exécuter des tâches de ratissage comme assets: précompile.

13
répondu PatrickEm 2013-08-31 07:33:54

j'avais besoin d'utiliser ce bijou:

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

et in /config/environments/production.rb je devais le définir:

config.assets.compile = true

mon interprétation est que le rails_12_factor gemmes config.serve_static_assets = true , entre autres choses.

7
répondu wuliwong 2014-07-24 17:54:08

dans mon cas, les actifs compilés en suivant les instructions ci-dessus, mais il n'était pas la cueillette du glyphicons bootstrap fontawesome-webfont 'donc cela a fonctionné pour moi finalement après avoir gaspillé tant d'heures de recherche.

fichier Gem

gem 'rails_12factor', group: :production

bundle install

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

environnement / production.rb

config.serve_static_assets = true

puis finalement, j'ai couru rake assets:precompile RAILS_ENV=production et l'a poussé à heroku et que travaillé.

6
répondu Syed Ehtsham Abbas 2013-07-24 11:43:41

C'était un problème avec le Ruby Heroku Buildpack, mais une mise à jour a été déployée aujourd'hui (2013-05-21). S'il vous plaît essayer it out et laissez-nous savoir.

pour répondre à vos questions:

#1) Il s'agit de la sortie sprockets; les choses sont compilées en /tmp puis déplacées (voir ici dans Sprockets ). À ma connaissance, cela a toujours été fait de cette façon, mais ce n'est que lorsque la version Sprockets a été mise à jour dans les Rails que nous avons obtenu ce nouveau sortie de type débogage.

#2) auparavant assets:precompile générait un fichier manifest.json , mais maintenant dans les Rails 4 le fichier du manifeste contient une empreinte digitale, qui n'a pas été détectée auparavant. Cela a été fixé avec #74 .

3
répondu catsby 2013-05-21 14:47:33

j'ai ajouté ceci au haut d'un de mes css.les fichiers scss dans le fichier assets/ stylesheets / folder.

@import "font-awesome";

s'est alors enfui..

rake assets:clean

et...

rake assets:precompile RAILS_ENV=production
2
répondu tuneyfish 2013-11-08 19:22:09

dans Rails 4.2.4 votre production.rb a la ligne:

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

cela signifie, gem 'rails_12factor', group: :production n'a pas besoin de le changer pour true, car il peut être défini à travers les variables d'environnement heroku. Vous recevrez également un avertissement si vous supprimez le Gem rails_12factor.

si vous avez problèmes avec les actifs , connectez-vous à la console heroku heroku run rails console et trouvez le chemin d'accès aux actifs pour un fichier puts helper.asset_path("application.js") .

un comportement étrange que j'ai remarqué entre le développement et la production, quand la fin de fichier n'est pas fournie:

avec une image /assets/images/image_01.jpg la sortie suivante de asset_paths diffère:

développement :

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

Production :

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

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

Vous ne pas exécuter RAILS_ENV=production rake assets:precompile , heroku ne ce pour vous pendant le déploiement. En outre, vous ne devez pas précompiler les actifs dans le développement et les pousser à heroku.

2
répondu neonmate 2015-11-06 20:09:09

en plus de vous assurer que vous avez le gem 'rails_12factor' installé, la seule chose que vous devez faire est ceci.

# config/application.rb

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

il semble que même si Rails sait exactement ce qu'il veut, Heroku doit se rappeler d'inclure le dossier assets dans les chemins assets.

1
répondu Evolve 2014-11-11 00:51:22

ajouter ce gemme gem 'rails_serve_static_assets'

https://github.com/heroku/rails_serve_static_assets

1
répondu Ben 2016-06-15 19:16:08

si vous utilisez des actifs spécifiques au contrôleur comme dans:

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

puis en production vous aurez besoin de précompiler explicitement ceux-ci (dans le développement rails compile des fichiers à la volée).

voir le guide officiel des Rails ici: http://guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets

pour précompiler comme expliqué dans les guides (ici: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets ) vous devrez ajouter ce qui suit à la configuration/application.rb

# 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
0
répondu Andrea 2014-06-09 05:09:30

je me dis que je vais ajouter ceci comme réponse puisque cette question est liée à partir de la page de soutien D'Heroku si vous cherchez "assets" .

c'est surtout pour les personnes qui mettent à jour leur application sur Rails 4, mais après avoir passé en revue ceci - et bien d'autres messages - ce qui m'a finalement amené à changer ce qui suit dans production.rb :

config.action_dispatch.x_sendfile_header = "X-Sendfile"

à:

config.action_dispatch.x_sendfile_header = nil

Je n'avais pas vu ça quand je amélioré et comme d'habitude cela m'a pris une éternité à comprendre. Espérons que cela aide quelqu'un d'autre! Criez à PatrickEm qui a demandé / répondu la même chose dans son question .

0
répondu tvalent2 2017-05-23 12:32:29

Utiliser Des Extensions D'Image

j'ai eu ce même problème, mais pour une raison différente.

au lieu de

<%= asset_path 'facebook-link' %>

utilisation:

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

alors que le premier travaillait localement, quand j'ai poussé à Heroku mes images se brisaient et je n'avais aucune idée pourquoi. En utilisant l'extension complète du fichier, vous avez corrigé le problème:)

0
répondu Phil 2016-04-25 15:39:22

cela ne répond peut-être pas à la cause profonde de la question initiale, mais j'avais un symptôme similaire avec une cause profonde différente.

pré-compilation D'un fichier JPEG modifie l'extension du fichier en JPG, ce qui signifie que asset_path("my_image.jpeg") et asset_path("my_image") n'ont pas fonctionné. Enlever le" e " de JPEG et voilà, ça marche.

d'Autres ont décrit le même problème ici https://blazarblogs.wordpress.com/2016/04/06/rails-force-to-precompile-jpeg-to-jpg/

est-ce un bug? Ou comportement souhaité? Et aussi bizarre que ça ne fonctionne pas dans mon environnement de production hébergé par Heroku. Peut-être qu'ils ont une sorte de configuration.

0
répondu Anthony Wood 2018-01-01 13:26:55