web-dev-qa-db-fra.com

Vider le cache du pipeline d'actifs Rails

Je démarre un nouveau projet dans Rails, et il semble que le fichier manifeste application.js fasse quelque chose de drôle avec les javascripts que je référence - met-il en cache ces fichiers dans le cadre du pipeline d'actifs?

Voici ce qui s'est passé. J'ai ajouté un fichier javascript nommé jquery.autoresize.js au dossier vendor/assets/javascripts, puis j'ai référencé le fichier dans le manifeste application.js comme ceci:

//= require jquery.autoresize.js 

Ensuite, j'ai démarré le serveur Rails. Mais après avoir navigué dans mon application, j'ai réalisé que j'avais accidentellement ajouté la mauvaise version du fichier jquery.autoresize.js. Donc, j'ai supprimé ce fichier puis ajouté la version correcte dans le dossier vendor/assets/javascripts. Mais, à ma grande horreur, lorsque j'ai rechargé la page, elle charge toujours l'ancien fichier javascript.

J'ai essayé de vider le cache de mon navigateur, puis de quitter et de redémarrer le serveur Rails, mais en vain. J'ai piraté une solution ensemble en renommant simplement mon fichier javascript et en référençant le nouveau nom, ce qui a bien fonctionné. Mais il doit y avoir une meilleure solution à cela.

Le nouveau pipeline d'actifs met-il en cache les fichiers auxquels vous faites référence d'une manière ou d'une autre? Si oui, comment puis-je vider ce cache? Merci pour toute aide!

43
Aaron Gray

Je suppose que nous parlons de l'environnement de production.

Lorsque vous modifiez l'un de vos javascripts ou feuilles de style dans l'environnement de production, vous devez exécuter rake assets:precompile; cette tâche compile et compresse les différents fichiers .js et .css et crée les fichiers application.js et application.css chargés par vos vues.

Il est possible que si vous avez remplacé jquery.autoresize.js avec une version avec un horodatage plus ancien, l'étape de précompilation pourrait l'ignorer, pensant que la version compilée est à jour. Vous pouvez éviter cela en exécutant rake assets:clean d'abord, le forçant à tout reconstruire dans le public/assets répertoire à partir de zéro.

54
benzado

Essayez aussi rake assets:clobber. Cela va tout réinitialiser et supprimer tous les actifs compilés. De plus, j'ai souvent besoin de paramétrer l'environnement avant de passer à la production en allant: Rails_ENV=production rake assets:precompile.

38
Dex

Rails efface automatiquement le cache d'un fichier individuel chaque fois que le contenu est modifié. Pour vider le cache d'un seul fichier, ouvrez simplement le fichier, modifiez une ligne de code et enregistrez-le de nouveau. Rails effacera le cache pour ce fichier, et le navigateur chargera le nouveau fichier lors du prochain chargement de la page.

La raison pour laquelle jquery.autoresize.js utilisait l'ancienne version mise en cache du fichier était parce que l'ancienne version a été supprimée, puis la nouvelle version a été copiée et collée avec le même nom dans le même dossier. Étant donné que le fichier lui-même n'a jamais été modifié, Rails a continué d'utiliser l'ancien fichier mis en cache.

En effet, le pipeline d'actifs utilise l'empreinte digitale pour le cache.

L'empreinte digitale est une technique qui fait dépendre le nom d'un fichier du contenu du fichier. Lorsque le contenu du fichier change, le nom de fichier est également modifié. Pour le contenu statique ou rarement modifié, cela permet de savoir facilement si deux versions d'un fichier sont identiques, même sur des serveurs ou des dates de déploiement différents.

Lorsqu'un nom de fichier est unique et basé sur son contenu, les en-têtes HTTP peuvent être définis pour encourager les caches partout (que ce soit sur les CDN, les FAI, les équipements réseau ou les navigateurs Web) à conserver leur propre copie du contenu. Lorsque le contenu est mis à jour, l'empreinte digitale change. Cela entraînera les clients distants à demander une nouvelle copie du contenu. Ceci est généralement connu sous le nom de contournement du cache.

La technique utilisée par Rails pour les empreintes digitales consiste à insérer un hachage du contenu dans le nom, généralement à la fin. Par exemple, un fichier CSS global.css pourrait être renommé avec un condensé MD5 de son Contenu:

global-908e25f4bf641868d8683022a5b62f54.css

Ainsi, si vous supprimez un fichier auquel vous faites référence dans le manifeste, puis copiez dans un nouveau fichier avec le même nom, la saturation du cache ne se produit jamais. Lorsque vous modifiez le fichier, l'empreinte digitale entre en jeu et un nouveau hachage est généré pour le nom de fichier. Cela brise le cache pour ce fichier.

Pour l'histoire complète, voir Qu'est-ce que l'empreinte digitale et pourquoi devrais-je m'en soucier? .

25
Aaron Gray

rake tmp:clear a fait l'affaire pour moi, j'utilise moins de Rails.

12
akz92

J'utilise config.assets.version = '1.01019' dans mon application.rb pour détruire tout le cache. Lorsque je veux pousser une nouvelle version complète, j'incrémente la version et cela fait l'affaire. Cela prend en charge les cas Edge où Rails ne recompile pas en tant qu'actif pour une raison quelconque.

6
user3670743