在 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;
}
}
}
}());
};
我有一个 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;
}
}
}
}());
};