Gruntjs:复制文件时replace模板

我正在写一个Gruntjs脚本

  • 连接+将一些JS文件的模板replace成目标目录(contrib-concat)
  • 复制+replace一些其他文件的模板(contrib-copy)
  • 将文件打包成一个zip文件

contrib-concat有一个布尔选项过程来处理文件时replace模板(如<% pkg.version %> )。

contrib-copy也有一个选项processContent ,但是我不知道如何用这个选项触发模板处理。

 module.exports = function(grunt) { grunt.initConfig({ meta: { banner: ' \ /*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n \ * <%= pkg.homepage %>\n \ */\n\n', build_date: '<%= grunt.template.today("yyyy-mm-dd") %>', build_num: process.env.BUILD_NUMBER || 0, // Jenkins build number if available version_string: '<%= pkg.version %>-<%= meta.build_num %>', dist_dir: 'dist/<%= pkg.version %>' }, pkg: grunt.file.readJSON('package.json'), concat: { options: { stripBanners: { block: true }, process: true, separator: '\n /* ----- */ \n', banner: '<%= meta.banner %>' }, dist: { src: [ 'src/ViewUtility.js', 'src/ViewClass.js', 'src/ViewClass.js', 'src/MarksClass.js', 'src/ViewVersion.js'], dest: 'build/View.js' } }, uglify: { options: { mangle: { except: ['jQuery', 'Hammer'] }, banner: '<%= meta.banner %>' }, dist: { src: '<%= pkg.main %>', dest: 'build/View.min.js' } }, copy: { options: { processContent: true }, dist: { files: [ {expand: true, cwd: 'build/', src: ['**'], dest: '<%= meta.dist_dir %>/view/'}, {expand: true, cwd: 'src/', src: ['View-tp.js'], dest: '<%= meta.dist_dir %>/view/'}, {expand: true, cwd: 'src/', src: ['plugin.json'], dest: '<%= meta.dist_dir %>/'} ] } }, compress: { dist: { options: { archive: 'view_' + '<%= meta.version_string %>_<%= meta.build_date %>' + '.zip' }, expand: true, cwd: 'dist/', src: ['**/*'] } } }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-compress'); grunt.registerTask('default', ['concat', 'uglify', 'copy', 'compress']); }; 

上面的processContent不起作用。 请build议解决scheme。

options.processContent属性的确是一个函数 。 你可以很容易地把它与内置的进程模板的咕噜声挂钩。

这段代码执行你的<%= pkg.version %>技巧。

 grunt.initConfig({ pkg: grunt.file.readJSON("package.json"), distdir: 'dist', srcdir: 'src', copy: { index: { options: { processContent: function (content, srcpath) { return grunt.template.process(content); } }, src: '<%= srcdir %>/index.html', dest: '<%= distdir %>/index.html' } } }); 

尝试这样的事情。

 processContent: function(content, srcpath) { content = content.replace(/^[\x20\t]+/mg, '').replace(/[\x20\t]+$/mg, ''); content = content.replace(/^[\r\n]+/, '').replace(/[\r\n]+$/, ''); return content; } 

processContent是一个函数types。 请参阅文档: https : //github.com/gruntjs/grunt-contrib-copy#processcontent

 processContent Type: Function(content, srcpath) This option is passed to grunt.file.copy as an advanced way to control the file contents that are copied.