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:
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.
group :production do
gem 'Rails_12factor'
end
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
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!
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.
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.
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.
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.
gem 'Rails_12factor', group: :production
installation groupée
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
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é.
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 .
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_paths
differs:
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.
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
Ajouter cette gemme gem 'Rails_serve_static_assets'
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.
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
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 :)
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 .
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.