我有一个使用typescript插件使用GruntJS构建的打字稿项目。我还有一个Visual Studio项目,我希望能够从中调用构建过程。
我第一次尝试这样做是在Visual Studio中向BeforeBuild目标添加<Exec>
任务,<Exec>
任务配置如下:
<Exec Command="grunt --no-color typescript" />
这样可以很好地运行构建,但是,当从Grunt输出错误并且它们填充VS中的错误列表时,文件名被错误地列为EXEC。
查看Exec Documentation我看到CustomErrorRegularExpression
是命令的参数,但我无法理解如何使用它来解决我的问题。
我搞砸了一下,并设法将报告的文件名更改为我的.jsproj文件,这也是不正确的。看this post我尝试形成自己的正则表达式:
<Exec CustomErrorRegularExpression="\.ts\([0-9]+,[0-9]+\):(.*)" Command="grunt --no-color typescript" IgnoreExitCode="true" />
有没有人有使用此参数的经验来实现此类事情?我想也许问题的一部分是grunt在两行中打印出错误?
答案 0 :(得分:1)
您正确处理单行消息的Exec任务是正确的。此外,它还使用Regex.IsMatch
来评估错误/警告条件,而不使用模式的捕获组。
我无法通过MSBuild找到解决此问题的方法,但更正以纠正问题的更改很容易直接在grunt任务中完成。
我正在使用来自https://www.npmjs.org/package/grunt-typescript的grunt-typescript任务。
完成这项工作需要进行3次微不足道的修改。
1)替换tasks/typescript.js
顶部附近的输出实用程序方法:
/* Remove the >> markers and extra spacing from the output */
function writeError(str) {
console.log(str.trim().red);
}
function writeInfo(str) {
console.log(str.trim().cyan);
}
2)替换Compiler.prototype.addDiagnostic
以在同一行上写入文件和错误数据:
Compiler.prototype.addDiagnostic = function (diagnostic) {
var diagnosticInfo = diagnostic.info();
if (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
,并且您的构建输出应显示错误文本,包括包含行和列信息的正确源文件。