在 Gruntfile.js 中执行 .tt 文件

Execute .tt files in Gruntfile.js

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

在其他项目中,我应用了这个问题中描述的解决方案:

但由于项目中可能有几十个或数百个 .tt 文件,因此编译项目可能有点激进。我只是 运行 来自 g运行 文件的特定 .tt 文件。提前致谢。

我想出了这个解决方案来解决我的问题。 我使用任务 transformFiles 创建了一个手表,以在 xml 文件发生更改时自动 运行 .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;
                }
            }
        }
    }());
};