Effacez le cache du pipeline d'actifs Rails

Je commence un nouveau projet dans Rails, et il semble que le fichier manifeste d'application.js fait quelque chose de drôle avec les javascripts que je fais référence: est-ce qu'il 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 fournisseur / assets / javascripts, puis référencé le fichier dans l'application.js comme suit:

//= require jquery.autoresize.js 

Ensuite, j'ai démarré le serveur de 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 j'ai ajouté la version correcte au dossier fournisseur / actif / javascripts. Mais, horriblement, lorsque j'ai rechargé la page, il charge toujours l'ancien fichier javascript.

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

Est-ce que le nouveau pipeline d'actifs cache les fichiers dont vous faites référence de quelque façon? Si oui, comment puis-je effacer ce cache? Merci pour toute aide!

    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 les rake assets:precompile ; Cette tâche compile et comprime 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 par une version avec un horodatage plus ancien , l'étape de précompilation pourrait l'ignorer, en pensant que la version compilée est à jour. Vous pouvez éviter cela en exécutant les rake assets:clean abord, le forcer à reconstruire tout dans le répertoire public/assets partir de zéro.

    Essayez aussi les rake assets:clobber . Cela annulera complètement tout et supprime tous les éléments compilés. En outre, j'ai souvent besoin de définir l'environnement avant de pousser vers la production en allant: RAILS_ENV=production rake assets:precompile .

    Rails efface automatiquement le cache pour un fichier individuel chaque fois que le contenu est modifié. Pour effacer le cache d'un seul fichier, ouvrez simplement le fichier, modifiez une ligne de code et sauvegardez-le. Rails effacera le cache pour ce fichier , et le navigateur va charger le nouveau fichier la prochaine fois que la page est chargée.

    La raison pour laquelle jquery.autoresize.js utilisait l'ancienne version 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é à utiliser l'ancien fichier mis en cache.

    C'est parce que le pipeline d'actifs utilise les empreintes digitales pour le cache.

    L'empreinte digitale est une technique qui rend le nom d'un fichier dépendant du contenu du fichier. Lorsque le contenu du fichier change, le nom du fichier est également modifié. Pour les contenus qui sont statiques ou rarement modifiés, cela fournit un moyen simple de dire si deux versions d'un fichier sont identiques, même sur différents serveurs ou dates de déploiement.

    Lorsqu'un nom de fichier est unique et basé sur son contenu, les en-têtes HTTP peuvent être configurés pour encourager les caches partout (qu'il s'agisse de CDN, de FAI, de matériel de réseau ou de navigateurs Web) à conserver leur propre copie du contenu. Lorsque le contenu est mis à jour, l'empreinte digitale changera. Cela fera en sorte que les clients distants demandent une nouvelle copie du contenu. Ceci est généralement connu sous le nom de suppression du cache.

    La technique que Rails utilise pour l'empreinte digitale est d'insérer un haché du contenu dans le nom, généralement à la fin. Par exemple, un fichier CSS global.css pourrait être renommé avec un résumé MD5 de son contenu:

     global-908e25f4bf641868d8683022a5b62f54.css 

    Donc, si vous supprimez un fichier que vous faites référence dans le manifeste, puis copiez dans un nouveau fichier portant le même nom, le dérangement du cache ne se produit jamais. Lorsque vous éditez le fichier, l'empreinte commence, et un nouveau hash est généré pour le nom du fichier. Cela bloque le cache pour ce fichier .

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

    J'utilise config.assets.version = '1.01019' dans mon application.rb pour config.assets.version = '1.01019' le cache entier. Quand je veux pousser une nouvelle version complète, j'implique la version et ça fait le tour. Cela prend en charge les cas où Rails ne se compile pas en tant qu'actif pour quelque raison que ce soit.

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