从MSBuild运行Grunt Typescript

时间:2014-01-29 23:35:57

标签: msbuild gruntjs msbuild-task

我有一个使用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在两行中打印出错误?

1 个答案:

答案 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,并且您的构建输出应显示错误文本,包括包含行和列信息的正确源文件。