如何在Directory.Build.props中判断项目是否使用Microsoft.NET.Sdk.Web SDK
问题
我有一个包含上百个项目的解决方案,希望在Directory.Build.props文件中实现集中化配置逻辑:当项目未默认处理appsettings.json文件时(Web项目默认已将这类文件包含到输出目录,无需额外处理),自动把所有appsettings*.json文件复制到输出目录。
具体需求:
- 使用
Microsoft.NET.Sdk.WebSDK的项目(如下代码),不执行该复制逻辑:
<Project Sdk="Microsoft.NET.Sdk.Web"> ... </Project>
- 使用
Microsoft.NET.SdkSDK的项目(如下代码),需要执行该复制逻辑:
<Project Sdk="Microsoft.NET.Sdk"> ... </Project>
我希望在Directory.Build.props中实现类似如下的配置,核心是要写出正确的判断条件:
<Project> ... <!-- Include appsettings.json files by convention --> <ItemGroup Condition="$(This project is NOT using Microsoft.NET.Sdk.Web)"> <None Update="appsettings*.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> ... </Project>
解决方案
可以通过MSBuild内置的$(Sdk)属性判断当前项目使用的SDK类型,直接在ItemGroup的Condition中添加判断逻辑即可。
最终配置代码
将Directory.Build.props中的对应部分修改为如下内容:
<Project> ... <!-- 按约定复制appsettings.json文件到输出目录(非Web项目生效) --> <ItemGroup Condition="'$(Sdk)' != 'Microsoft.NET.Sdk.Web'"> <None Update="appsettings*.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> ... </Project>
逻辑说明
$(Sdk)属性会被MSBuild自动设置为项目根节点指定的SDK值,Web项目的$(Sdk)为Microsoft.NET.Sdk.Web,普通类库/控制台项目则为Microsoft.NET.Sdk。- 条件
'$(Sdk)' != 'Microsoft.NET.Sdk.Web'表示:仅当项目不使用Web SDK时,才执行该ItemGroup下的复制配置。 PreserveNewest确保只有源文件比输出目录中的文件新时才会复制,避免不必要的重复操作。
内容的提问来源于stack exchange,提问作者Zoltán Tamási
相关产品推荐
相关产品推荐

