web-dev-qa-db-fra.com

Ajouter dynamiquement le numéro de version aux fichiers de sortie de destination avec grunt

J'ai un fichier package.json avec notre numéro de version, tel que:

{
    name: "myproject"
    version: "2.0"
}

Mon objectif est d’ajouter dynamiquement le numéro de version du fichier package.json aux fichiers de sortie. Par exemple, dans le javascript, je ne souhaite pas mettre à jour manuellement le numéro de version, mais souhaite que quelque chose de similaire à celui-ci soit généré après chaque build grunt:

/* My Project, v2.0 */
window.myProject = {
    version: "2.0"
};

Y at-il un moyen facile de faire cela dans ma configuration Gruntfile.js?

26
adam

J'ai implémenté: https://github.com/erickrdch/grunt-string-replace

Dans mes fichiers source css/js, j’utilise le texte {{ VERSION }} qui est remplacé par le numéro de version défini dans le fichier package.json. Ci-dessous la configuration que j'ai ajoutée à Gruntfile.js.

'string-replace': {
  version: {
    files: {
      // the files I did string replacement on
    },
    options: {
      replacements: [{
        pattern: /{{ VERSION }}/g,
        replacement: '<%= pkg.version %>'
      }]
    }
  }
},
pkg: grunt.file.readJSON('package.json'),
50
adam

Je pense que ce que vous voulez seulement faire est de mettre une sorte d'astuce pour que la page ne puisse pas utiliser les fichiers de cache que possède peut-être le navigateur, et pour l'instant, le seul moyen pour ce navigateur cross est de placer quelque chose sur les URL href. comme "app.v2_2.js" ou "app.js? ver = 22". J'utilise donc ce paquet grunt npm:

https://www.npmjs.org/package/grunt-cache-breaker

Par défaut, il ajoute seulement un paramètre à votre javascript et, dans presque tous les cas, vous avez besoin de ne pas utiliser le cache, mais vous pouvez le configurer même si vous modifiez le nom du fichier dans un autre processus de grognement. Cela ne fait que changer les en-têtes HTML à votre convenance.

Après avoir installé le grunt-cache-breaker, ajoutez ceci à votre GruntFile:

// Append a timestamp to 'app.js', 'controllers.min.js' which are both located in 'index.html'
// resulting in the index the call of : href="~/app.js?rel=1415124174159"...
        cachebreaker: {
            dev: {
                options: {
                    match: ['app.js', 'styles.css']
                },
                files: {
                    src: ['dist/index.html']
                }
            }
        },

Puis où vous chargez les modules:

grunt.loadNpmTasks('grunt-cache-breaker');

Ajoutez la tâche que vous souhaitez:

grunt.registerTask('deploy', [
        'clean:app',
        'copy:views',
        'copy:imgs',
        'copy:css',
        'uglify:app',
        'cssmin:app',
        'cachebreaker:dev'
    ]);

Et enfin, lancez l’action grunt sur la console/invite de commande

> grunt deploy
11
Luis Gonzalez

cela peut aussi être fait avec l'option bannière de https://github.com/gruntjs/grunt-contrib-uglify - qui prend également en charge la minifiaction des fichiers javascript.

2
Andreas

Je suggère d'utiliser la fonctionnalité bannière dans grunt-contrib-concat

2
robertjd

filerev fournit cette option maintenant. Utilisez process pour manipuler le nom de fichier qui sera par ailleurs suffixé du hash md5 du contenu du fichier. Vous pouvez l'utiliser pour insérer votre version dans chaque fichier souhaité.

Réf.: https://github.com/yeoman/grunt-filerev

0
Mahesh M