在 VS2019 solution/MSBuild 中覆盖 tsconfig.json?
Override tsconfig.json in a VS2019 solution/MSBuild?
我有一个 Visual Studio 解决方案(不是 VS Code),其中包含多个 tsconfig.json
文件,我希望在生产中表现不同。
我想要两个文件(也许更多),例如:
tsconfig.json
这部分解决方案的默认设置:
{
"compilerOptions": {
"sourceMap": true,
"removeComments": false,
...
},
... lots more settings
}
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.json
或 tsconfig.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
中的相对路径仍能找到它。
我有一个 Visual Studio 解决方案(不是 VS Code),其中包含多个 tsconfig.json
文件,我希望在生产中表现不同。
我想要两个文件(也许更多),例如:
tsconfig.json
这部分解决方案的默认设置:
{
"compilerOptions": {
"sourceMap": true,
"removeComments": false,
...
},
... lots more settings
}
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.json
或 tsconfig.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
中的相对路径仍能找到它。