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:
- comment se fait-il que Heroku compile des fichiers d'actifs vers /tmp?
- 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?
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
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
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!
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é.
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.
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.
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é.
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 .
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
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.
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.
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
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 .
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:)
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.