从MSBuild运行Grunt Typescript

从MSBuild运行Grunt Typescript,msbuild,gruntjs,msbuild-task,Msbuild,Gruntjs,Msbuild Task,我已经建立了一个typescript项目,该项目正在使用GruntJS使用typescript插件构建。我还有一个VisualStudio项目,我希望能够从中调用构建过程 我的第一次尝试是在visual studio中将任务添加到BeforeBuild目标,任务的配置如下: 但是,当从Grunt输出错误并填充VS中的错误列表时,文件名被错误地列为EXEC,这会很好地运行构建 查看,我看到CustomErrorRegularExpression是该命令的一个参数,但我不太明白如何使用它来解决我的

我已经建立了一个typescript项目,该项目正在使用GruntJS使用typescript插件构建。我还有一个VisualStudio项目,我希望能够从中调用构建过程

我的第一次尝试是在visual studio中将
任务添加到BeforeBuild目标,任务的配置如下:

但是,当从Grunt输出错误并填充VS中的错误列表时,文件名被错误地列为EXEC,这会很好地运行构建

查看,我看到
CustomErrorRegularExpression
是该命令的一个参数,但我不太明白如何使用它来解决我的问题

我把它弄得有点乱,并设法将报告的文件名更改为我的.jsproj文件,这也是不正确的。看看我自己的正则表达式:


有没有人有使用这个参数的命令来实现这类事情的经验?我认为部分问题是grunt在两行中打印错误?

关于Exec任务只处理单行消息的说法是正确的。此外,它还使用
Regex.IsMatch
来评估错误/警告条件,而不使用模式的捕获组

我无法通过MSBuild找到解决这一问题的方法,但是在grunt任务中直接修改以纠正问题很容易

我正在使用来自的grunt typescript任务:

要使这项工作正常进行,需要进行3项细微的更改

1)替换
tasks/typescript.js顶部附近的输出实用程序方法:

/*从输出中删除>>标记和额外间距*/
函数writeError(str){
console.log(str.trim().red);
}
函数writeInfo(str){
console.log(str.trim().cyan);
}
2)替换
Compiler.prototype.addDiagnostic
将文件和错误数据写入同一行:

Compiler.prototype.addDiagnostic=函数(诊断){
var diagnosticInfo=diagnostic.info();
如果(diagnosticInfo.category==1)
this.hasErrors=true;
var message=“”;
if(diagnostic.fileName()){
message=diagnostic.fileName()+
(“+(diagnostic.line()+1)+”、“+(diagnostic.character()+1)+”);
}
this.ioHost.stderr.Write(message+diagnostic.message());
};

一旦进行了这些更改,您就不再需要在Exec任务中设置
CustomErrorRegularExpression
,并且您的生成输出应该显示错误文本,包括正确的源文件以及行和列信息。

Nice!我没有想到修改grunt任务本身。