Adicione dinamicamente o número da versão aos arquivos de saída de destino com grunhido

Eu tenho um arquivo package.json com nosso número de versão, como:

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

Meu objective é adicionar dinamicamente o número da versão do arquivo package.json nos arquivos de saída. Por exemplo, no javascript eu não quero atualizar manualmente o número da versão, mas gostaria que algo semelhante a isso fosse gerado após cada build grunt:

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

Existe uma maneira fácil de fazer isso na minha configuração Gruntfile.js?

Eu implementei: https://github.com/erickrdch/grunt-string-replace

Nos meus arquivos css / js de origem, eu uso o texto {{ VERSION }} que é substituído pelo número de versão definido no arquivo package.json . Abaixo está a configuração que adicionei ao 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'), 

Eu acho que o que você só quer fazer é colocar algum tipo de truque para que a página não use os arquivos de cache que talvez o navegador tenha, e agora o único caminho para esse cross-browser é colocar algo nas url href como “app.v2_2.js” ou “app.js? ver = 22”. Então eu uso esse grunhido pacote npm:

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

Por padrão, ele adiciona apenas um parâmetro ao seu javascript e, em quase todos os casos, é o que você precisa para não usar o cache, mas pode ser configurado mesmo se você alterar o nome do arquivo em outro processo grunhido. Isso só muda os headers de HTML para o que você deseja.

Depois de instalar o grunt-cache-breaker, inclua isto no seu 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'] } } }, 

Então, onde você carrega os módulos:

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

Adicione a tarefa que você deseja:

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

E finalmente executar a ação grunhida no prompt de comando / console

 > grunt deploy 

Eu sugeriria usar o recurso de banner em grunt-contrib-concat

isso pode ser feito também com a opção de banner https://github.com/gruntjs/grunt-contrib-uglify – que também cuida da minifiacção dos arquivos javascript.

filerev fornece essa opção agora. Use o processo para manipular o nome do arquivo que, de outra maneira, seria sufixado com o hash md5 do conteúdo do arquivo. Você pode usar isso para inserir sua versão em todos os arquivos desejados.

Ref: https://github.com/yeoman/grunt-filerev

criar algo como package.json na raiz do seu projeto

deve ler isso ou você pode fazer algo parecido

 pkg: grunt.file.readJSON('package.json'), 

em que você terá uma declaração de version que obviamente corresponderia a <%= pkg.version %> então tenha essa string em sua saída do json e então execute grunt.config.process para fazer a substituição da variável

fazer algo semelhante para o header do comentário