web-dev-qa-db-fra.com

Comment éviter que les actifs précompilés soient servis en mode développement?

Je préfère pas pour concaténer des fichiers JavaScript en mode développement, mais les servir comme fichiers individuels. J'ai donc configuré:

development.rb:

config.assets.compress = false
config.assets.debug = true
config.assets.compile = true

Dans mon répertoire/app/assets/javascript, j'ai:

  • reviews.js
  • commentaires/
    • foo.js
    • bar.js

reviews.js:

//= require jquery
//= require jquery_ujs
//= require_tree ./reviews

J'inclus le JavaScript en utilisant <%= javascript_include_tag "reviews" %> dans ma mise en page. La page générée référence correctement les trois scripts individuellement et reviews.js est essentiellement vide. Jusqu'ici tout va bien.

Maintenant, lorsque je précompile mes actifs pour la production à l'aide de rake assets:precompile les trois fichiers JavaScript sont concaténés dans reviews.js. C'est très bien pour la production mais maintenant, en mode développement , le reviews.js est servi en plus aux deux fichiers individuels.

Bien sûr, cela conduit à toutes sortes de bugs désagréables lors du développement, car maintenant, le contenu de foo.js et bar.js est servi deux fois, l'un d'eux dans une version potentiellement plus ancienne dans reviews.js.

Comment puis-je m'assurer que Rails n'utilise pas les ressources précompilées en mode développement?

53
Ortwin Gentz

Il semble que vous précompiliez localement. Étant donné que les fichiers existent à l'emplacement prévu, ils sont servis par votre serveur de développement et les demandes ne sont pas envoyées à Sprockets.

La seule façon de l'arrêter est de supprimer les fichiers compilés.

Normalement, vous n'avez pas besoin de compiler localement. Il est prévu que dans presque tous les cas, la tâche de précompilation sera exécutée pendant le déploiement de l'application. Il existe une recette Capistrano pour cela sur la page du guide du pipeline d'actifs.

Si vous avez besoin que ces fichiers soient validés localement dans votre référentiel, vous pouvez utiliser une branche pour éviter le problème. Réservez votre branche principale pour le code de production et créez une deuxième branche pour le développeur. Compiler et valider uniquement les actifs sur le maître. Lorsque vous passez au dev, ils disparaîtront. Fusionnez le dev en master si nécessaire.

Modifier: assurez-vous de forcer la mise à jour de votre navigateur (contrôle + F5) ou vous pouvez trouver les anciens actifs utilisés dans le cache du navigateur!

53
Richard Hulse

Dans config/environments/development.rb ensemble:

config.assets.prefix = "/assets_dev"

de sorte qu'en développement mode Rails y regardera (mais il ne trouvera rien, car vous ne compilerez pas de ressources en développement (c'est en effet ce que vous essayez de ne pas compiler les actifs)).

Lors de la précompilation pour production, utilisez

Rails_ENV=production rake assets:precompile

afin qu'il se compile dans le dossier d'actifs par défaut, public/assets.

80
Haim Lankry

dans config/environments/development.rb ensemble:

config.serve_static_assets = false

et aucun fichier de /public Sera servi

17
Peter Madsen

Je l'ai essayé et ça marche. rake assets:precompile Rails_ENV=production

J'ai observé que la nouvelle version du pipeline d'actifs le fait lorsque vous exécutez rake assets:precompile Est-ce que rake assets:precompile:all

1
Uchenna