You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Directory.Build.props中判断项目是否使用Microsoft.NET.Sdk.Web SDK

问题

我有一个包含上百个项目的解决方案,希望在Directory.Build.props文件中实现集中化配置逻辑:当项目未默认处理appsettings.json文件时(Web项目默认已将这类文件包含到输出目录,无需额外处理),自动把所有appsettings*.json文件复制到输出目录。

具体需求:

  • 使用Microsoft.NET.Sdk.Web SDK的项目(如下代码),不执行该复制逻辑:
<Project Sdk="Microsoft.NET.Sdk.Web">
  ...
</Project>
  • 使用Microsoft.NET.Sdk SDK的项目(如下代码),需要执行该复制逻辑:
<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:15:58