.NET 5单元测试项目IsPublishable属性被忽略该如何解决?
问题原因
- .NET 5 测试项目默认引用的
Microsoft.NET.Test.Sdk包会在构建流程末尾重写IsPublishable属性的取值,如果你在项目文件开头声明该属性,会被测试SDK的默认配置覆盖,导致配置不生效 - 另一种常见场景是你的主业务项目存在直接/间接引用测试项目的情况,此时哪怕测试项目本身标记为不可发布,它的输出文件也会作为依赖项被拷贝到发布目录
解决方法
方法1:修正测试项目的配置优先级
把测试项目的不可发布配置移到项目文件的最末尾,放在所有 <Import> 节点之后,确保不会被后续导入的SDK配置覆盖,示例如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>$(ApplicationTargetFramework)</TargetFramework> <IsPackable>false</IsPackable> </PropertyGroup> <!-- 中间的包引用、项目引用等其他配置 --> <!-- 放在文件最后,优先级最高 --> <PropertyGroup> <IsPublishable>false</IsPublishable> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </PropertyGroup> </Project>
如果需要批量配置所有测试项目,可以在解决方案根目录新建 Directory.Build.props 文件,添加全局规则,不用逐个修改测试项目:
<Project> <PropertyGroup Condition="$(MSBuildProjectFullPath.Contains('\test\')) or '$(IsTestProject)' == 'true'"> <IsPublishable>false</IsPublishable> <IsPackable>false</IsPackable> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </PropertyGroup> </Project>
方法2:指定发布单个项目(最稳妥)
不要直接对整个解决方案执行publish命令,改为指定src目录下的主入口项目执行发布,只会处理主项目和它的依赖项,完全不会涉及test目录的项目:
dotnet publish src/你的主项目名称/你的主项目名称.csproj -c Release -o publish
方法3:使用解决方案过滤器
如果需要批量发布src下的多个项目,可以新建解决方案过滤器(后缀为.slnf),仅加入src目录下的所有业务项目,发布时直接指定过滤器文件即可:
dotnet publish 仅包含src项目的过滤器名称.slnf -c Release -o publish
内容的提问来源于stack exchange,提问作者diegosasw
相关产品推荐
相关产品推荐

