在 VS2019 solution/MSBuild 中覆盖 tsconfig.json?

Override tsconfig.json in a VS2019 solution/MSBuild?

我有一个 Visual Studio 解决方案(不是 VS Code),其中包含多个 tsconfig.json 文件,我希望在生产中表现不同。

我想要两个文件(也许更多),例如:

  1. tsconfig.json这部分解决方案的默认设置:
{
  "compilerOptions": {
    "sourceMap": true,
    "removeComments": false,
    ...
  },
  ... lots more settings
}
  1. tsconfig.release.json 覆盖这些设置以排除评论和源地图:
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "sourceMap": false,
    "removeComments": true
  }
}

如何告诉 VS2019/MSBuild 在进行发布构建或发布时使用 tsconfig.release.json 覆盖?

我找到了一种方法来做到这一点,但这很糟糕,我很乐意接受更好的答案。

tsc 可以采用自定义配置文件名,但如果您将 <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked> 添加到项目文件并向 [=55= 添加其他内容,则只能从 MSBuild 运行 它] 它。

MSBuild 对于 Release 和 Debug 可以有不同的选项,但是 只有 如果它拥有所有 Typescript 配置并且项目中的任何地方都没有名为 tsconfig.json 的文件。

MSBuild 可以 在任何文件夹深度找到任何 tsconfig.json,但找不到任何其他文件名 - tsconfig.release.jsontsconfig.debug.json出来了。

MSBuild 还可以更改其包含文件的规则,因此解决方案:

  • 将版本覆盖移动到文件夹,因此 tsconfig.release.json 变为 releaseConfig/tsconfig.json。它现在需要一些相对路径来找到项目:
{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "sourceMap": false,
    "removeComments": true
  },
  "include": [ "../**/*" ]
}
  • 接下来我们需要对 .csproj 文件进行两处更改。首先,我们阻止在 non-release 构建中获取此配置:
<ItemGroup Condition="'$(Configuration)|$(Platform)'!='Release|AnyCPU'">
    <Content Remove="whatever\releaseConfig\tsconfig.json" />
    <None Include="whatever\releaseConfig\tsconfig.json" />
</ItemGroup>
  • 最后在发布版本中我们交换了文件:
<ItemGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <Content Remove="whatever\tsconfig.json" />
    <None Include="whatever\tsconfig.json" />
    <None Remove="whatever\releaseConfig\tsconfig.json" />
</ItemGroup>

默认 tsconfig.json 已从 <Content> 中删除,但需要 <None> 以便 releaseConfig\tsconfig.json 中的相对路径仍能找到它。