在Gruntfile.js中执行.tt文件

时间:2016-08-26 09:21:03

标签: gruntjs

我有一个Gruntfile.js,我在VS2015中通​​过Task Runned Explorer配置它来运行Before Build。 我需要在这个Gruntfile中添加一个新任务,在这个新任务中,我应该比较项目中2个文件的DateLastModified,如果不同,我应该在项目中运行特定的.tt文件。我怎样才能获得这个?

在其他项目中,我应用了此问题中描述的解决方案: https://stackoverflow.com/a/3381556/5816699

但是因为我可以在项目中拥有几十个或几百个.tt文件,所以可能会对项目进行一些积极的编译。我只是从grunfile运行特定的.tt文件。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我提出了这个解决方案以解决我的问题。 我创建了一个手表,以便在更改xml文件时使用任务transformFiles自动运行.tt文件。

如果在构建之前运行任务XXX,请使用Task Runner Explorer附加任务,如何执行此操作: https://visualstudiogallery.msdn.microsoft.com/8e1b4368-4afb-467a-bc13-9650572db708

module.exports = function (grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        watch: {
            all: {
                files: ['**/*Config.xml', '**/*Other.xml'],
                tasks: ['XXX'],
            },
        },
    });
    var spawn = require('child_process').spawn;
    var exec = require('child_process').exec;
    var textTransformPossiblePaths = ['C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\TextTemplating\\14.0\\TextTransform.exe',
                                    'C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\TextTemplating\\12.0\\TextTransform.exe',
                                    'D:\\Program Files (x86)\\Common Files\\Microsoft Shared\\TextTemplating\\14.0\\TextTransform.exe',
                                    'D:\\Program Files (x86)\\Common Files\\Microsoft Shared\\TextTemplating\\12.0\\TextTransform.exe'];
    var patterns = {
        allT4: ['**/*.tt', '!**/bin/**', '!**/node_modules/**'],
        watchXml: ['**/*Config.xml', '**/*Other.xml']
    };

    grunt.loadNpmTasks('grunt-contrib-watch');
    require('time-grunt')(grunt);

    grunt.registerTask('XXX', [], function () {
        var fs = require('fs');
        const path = require('path');
        var filesXML = [];

        for (i = 0; i < patterns.watchXml.length ; i++) {
            var files = grunt.file.expand(patterns.watchXml[i]);
            files.forEach(function (element) {
                filesXML.push(element);
            });
        };        
        for (i = 0; i < filesXML.length ; i++) {
            var filesCS = grunt.file.expand(path.dirname(filesXML[i]) + "/" + "*.cs");
            var filesTT = grunt.file.expand(path.dirname(filesXML[i]) + "/" + "*.tt");
            for (j = 0; j < filesCS.length ; j++) {
                if (fs.lstatSync(filesXML[i]).mtime > fs.lstatSync(filesCS[j]).mtime) {
                    for (k = 0 ; k < filesTT.length; k++) {
                        var t4Path = textTransformPossiblePaths.filter(function (f) { return fs.existsSync(f); })[0];
                        exec('"' + t4Path + '" ' + [filesTT[k]] + '"');
                    }
                    break;
                }
            }
        }
    }());
};