web-dev-qa-db-fra.com

Heroku NE compile PAS les fichiers sous les pipelines d’actifs dans Rails 4

Tout se passe bien sur une machine locale avec un pipeline d’actifs dans Rails 4 et Ruby 2.0. Mais lors du déploiement à Heroku, il est dé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 aucune erreur. Mes questions sont:

  1. Comment Heroku compile-t-il les fichiers d’actifs dans/tmp?
  2. Ma dernière solution consistait à exécuter Rails_ENV = actifs de rake exec de bundle de production: précompiler localement, mais cela générait un fichier manifest-xxxxxx.json dans public/assets, plutôt que manifest.yml, de sorte que heroku ne détecte pas le fichier manifeste JSON. Je l'ai trié en créant manuellement un fichier yml à partir du fichier json et heroku est devenue heureuse. L'approche de heroku est-elle dépassée?
77
aquajach

Les plugins d'actifs de Heroku ne fonctionnent plus car Rails 4 ne prend pas en charge les plugins. Vous devez utiliser les gemmes d'actif de 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

Suivez Le guide de Heroku pour commencer à utiliser Rails 4.

Mise à jour (22/07/2013): Heroku fournit désormais un bijou différent pour précompiler des ressources.

group :production do
  gem 'Rails_12factor'
end
102
Joseph Jaber

Vous devez configurer Rails pour gérer les actifs statiques en production: config/environnements/production.rb

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

METTRE À JOUR:

Dans Rails 4, obsolète et modifié par:

config.serve_static_files = true 
33
Israel Barba

Depuis que Rails 4 a remplacé manifest.yml par manifest- (empreinte digitale) .json , vous souhaiterez activer le service d’actif statique.

Depuis Prise en main de Rails 4.x sur Heroku :

gem 'Rails_12factor', group: :production

puis

bundle install

et enfin,

git Push heroku

Correction du problème pour moi. J'espère que cela t'aides!

16
voss

Je cours exactement dans le même problème.

J'ai défini config.serve_static_assets = true dans mon fichier environnements/production.rb jusqu'à ce que heroku ne prenne pas en charge le nouveau format de manifeste.

Il s’agit donc d’une solution temporelle jusqu’à l’ajout du support heroku.

14
Boti

Après des heures de recherche dans lesquelles aucun des guides sur Heroku ou les suggestions sur StackOverFlow ne m'aident, je suis finalement tombé sur cet article de blog qui offrait cet indice:

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

Sans cela, le pipeline d'actifs essaiera toujours d'initialiser l'application entière et de se connecter à la base de données (malgré tout ce que vous avez pu lire, à savoir que Rails 4 ne le fait plus depuis longtemps). Cela expose votre configuration Heroku à Rails afin qu'il puisse démarrer correctement et exécuter des tâches de rake telles que les ressources: précompiler.

13
PatrickEm

J'avais besoin d'utiliser ce petit bijou:

gem 'Rails_12factor', group: :production #need this for Rails 4 assets on heroku

Et dans /config/environments/production.rb je devais définir:

config.assets.compile = true

D'après ce que je comprends, la gemme Rails_12_factor définit config.serve_static_assets = true, entre autres choses.

7
wuliwong

Dans mon cas, les ressources ont été compilées conformément aux instructions ci-dessus, mais il ne s'agissait pas de choisir 'fontawesome-webfont' des glyphiques bootstrap, donc cela a finalement fonctionné pour moi après avoir perdu tant d'heures de recherche.

Fichier Gem

gem 'Rails_12factor', group: :production

installation groupée

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

Enfin, j'ai lancé rake assets:precompile Rails_ENV=production et l'ai poussé vers heroku et cela a fonctionné.

5
Syed Ehtsham Abbas

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

Pour répondre à vos questions:

# 1) Ceci est la sortie des pignons; les choses sont compilées dans /tmp et ensuite déplacées (voir ici dans Sprockets ). À ma connaissance, cela a toujours été fait de cette façon, mais nous n’avons eu cette nouvelle sortie de type debug que lorsque la version de Sprockets a été mise à jour dans Rails. 

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

3
catsby

Dans Rails 4.2.4, votre production.rb a la ligne:

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

Cela signifie que gem 'Rails_12factor', group: :production n'a pas besoin de le changer en vrai, car il peut être défini via les variables d'environnement heroku. Vous recevrez également un avertissement si vous supprimez la gemme Rails_12factor.

Si vous avez des problèmes avec les ressources , connectez-vous à la console heroku heroku run Rails console et recherchez le chemin des ressources pour un fichier puts helper.asset_path("application.js").

Un comportement étrange que j'ai remarqué entre le développement et la production, lorsque la fin du fichier n'est pas fournie:

Avec une image /assets/images/image_01.jpg la sortie suivante de asset_pathsdiffers:

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

Not devez exécuter Rails_ENV=production rake assets:precompile, heroku le fait pour vous pendant le déploiement. De plus, vous n'avez pas à précompiler les actifs en développement et les pousser à heroku. 

2
neonmate

J'ai ajouté ceci au sommet de l'un de mes fichiers css.scss dans le dossier assets/stylesheets /.

@import "font-awesome";

puis couru ..

rake assets:clean

et...

rake assets:precompile Rails_ENV=production
2
tuneyfish

Ajouter cette gemme gem 'Rails_serve_static_assets'

https://github.com/heroku/Rails_serve_static_assets

1
Ben

En plus de vous assurer que la gem 'Rails_12factor' est installée, la seule chose que vous devez faire est la suivante.

# config/application.rb

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

Il semble que bien que Rails sache exactement ce qu’il souhaite, Heroku a besoin de rappeler d’inclure le dossier d’actifs dans le chemin des actifs.

1
Evolve

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

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

Ensuite, en production, vous devrez explicitement précompiler ceux-ci (en développement, Rails compile les fichiers à la volée).

Voir le guide officiel 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 à config/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
Andrea

Utiliser les extensions d'image

J'ai eu le 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 fonctionnait localement, lorsque j'ai poussé à Heroku, mes images se cassaient et je ne savais pas pourquoi. L'utilisation de l'extension de fichier complète a résolu le problème :)

0
Phil

Je pense que je vais ajouter ceci comme réponse car cette question est liée à la page d'assistance Heroku si vous recherchez "assets".

Ceci est principalement destiné aux personnes qui mettent à jour leur application vers Rails 4, mais après avoir parcouru cela - et de nombreux autres SO messages -, ce qui m'a finalement amené à changer les éléments suivants dans production.rb:

config.action_dispatch.x_sendfile_header = "X-Sendfile"

À:

config.action_dispatch.x_sendfile_header = nil

Je ne l'avais pas compris lors de ma mise à niveau et, comme d'habitude, cela m'a pris une éternité à comprendre. Espérons que cela aide quelqu'un d'autre! Merci à PatrickEm qui a demandé/a répondu la même chose dans sa question .

0
tvalent2

Cela ne répond peut-être pas à la cause première de la question initiale. Mais je présentais un symptôme similaire avec une cause première différente.

La pré-compilation d'un fichier JPEG change l'extension du fichier en JPG, ce qui signifie que asset_path("my_image.jpeg") et asset_path("my_image") ne fonctionnaient pas. Supprimez le "e" de JPEG et le tour est joué, cela fonctionne.

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 étrange que cela ne fonctionne que dans mon environnement de production hébergé par Heroku. Peut-être qu'ils ont une sorte de configuration.

0
Anthony Wood