【问题标题】:Report typescript errors as warnings in Visual Studio and don't fail the build在 Visual Studio 中将 typescript 错误报告为警告,并且不会使构建失败
【发布时间】:2019-12-03 09:21:22
【问题描述】:

我想对现有的 javascript 代码进行类型检查。为此,我指定了以下 tsconfig。运行tsc 会导致数百个错误,这些错误会在我进行构建时出现在 Visual Studio 中。但是,这些错误现在也使构建失败。由于代码当前正在运行,我想推迟解决这些错误。我希望将错误报告为警告,这样构建将继续,我们可以逐步改进 javascript。

// tsconfig.json
{
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "es5",
    "checkJs": true,
    "allowJs": true,
    "noEmit": true
  }
}
//csproj (abbreviated)
<Project>
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props')" />
  <PropertyGroup>
    <TypeScriptToolsVersion>3.6</TypeScriptToolsVersion>
  </PropertyGroup>
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
</Project>
...

示例 msbuild 输出:

...
file.js:153:33 - error TS2769: No overload matches this call.
========== Build: 14 succeeded, 1 failed, 23 up-to-date, 0 skipped ==========

【问题讨论】:

  • 我认为 msbuild 会监视输出中的“错误”一词。当它发生时,它会标记一个错误。
  • 这些错误是由msbuild编译识别出来的,你不能忽略它们,把它们变成警告。或者您可以尝试重写或禁用 msbuild 构建工具的错误检测任务。

标签: typescript msbuild visual-studio-2019 csproj


【解决方案1】:

据我回忆,msbuild 的exec 命令会在输出中搜索单词error,如果找到则会发出构建错误。

这个 linter *.targets 文件似乎在做什么。 并且似乎在这里得到证实:
Does the MSBuild Exec task search STDOUT for the string "error"?

但真的:
如果您想推迟修复这些错误,我认为别无选择,只能从 *.csproj 文件中完全删除您的 linter。我的意思是为什么放入 linter 只是为了忽略它并推迟你的技术债务?

在这种情况下,我只需将您共享的代码从 .csproj 文件中提取出来,并将其放入单独的独立 msbuild 文件中并单独运行。

【讨论】:

  • 我正在使用 Visual Studio 提供的构建目标,所以我的 csproj 中没有 Exec。编译由名为&lt;VsTsc ... /&gt; 的元素处理。我不完全确定该元素的实现位置/方式。
  • 关于“我的意思是为什么放入 linter 只是为了忽略它并推迟你的技术债务?”。简单地;使用我们的构建统计数据等,让团队可以看到技术债务。
  • 的调用是通过您 的目标文件传入的
  • 我深入研究了导入的定义;事实证明,对编译器的调用是通过任务处理的(&lt;UsingTask TaskName="TypeScript.Tasks.VsTsc" AssemblyFile="$(TypeScriptTaskAssembly)" /&gt;&lt;TypeScriptTaskAssembly Condition="'$(TypeScriptTaskAssembly)' == ''"&gt;$(MSBuildThisFileDirectory)TypeScript.Tasks.dll&lt;/TypeScriptTaskAssembly&gt;,另请参见 MSBuild Tasks
猜你喜欢
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多