.NET 7中Directory.Build.props条件属性不生效问题求助
解决.NET 7中Package属性仅在打包时生效的配置问题
问题根源
你的配置不生效的核心原因是Directory.Build.props的加载顺序早于项目文件。MSBuild会先读取Directory.Build.props,再加载Project.csproj里的属性设置,所以props里的条件'$(GeneratePackageOnBuild)' == 'true'无法读取到项目文件中后续设置的值。另外,当前配置也没覆盖手动执行dotnet pack命令的场景——此时即使GeneratePackageOnBuild为false,也应该启用这些属性。
正确配置方案
方案1:改用Directory.Build.targets(推荐)
将原本在Directory.Build.props里的配置移到Directory.Build.targets文件中,因为targets文件在项目文件之后加载,能正确读取到项目里设置的GeneratePackageOnBuild值。同时添加对打包操作的判断,覆盖手动执行dotnet pack的场景:
<Project> <PropertyGroup Condition="'$(GeneratePackageOnBuild)' == 'true' OR '$(IsPacking)' == 'true'"> <PackageIcon>favicon.ico</PackageIcon> <PackageReadmeFile>README.md</PackageReadmeFile> <PublishRepositoryUrl>true</PublishRepositoryUrl> <EmbedUntrackedSources>true</EmbedUntrackedSources> <IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat> </PropertyGroup> </Project>
方案2:调整Directory.Build.props的条件逻辑
如果你坚持使用props文件,可以通过提前检测打包相关的MSBuild目标来覆盖场景,同时让项目里的GeneratePackageOnBuild能被正确识别:
<Project> <!-- 先设置默认值,允许项目文件覆盖 --> <PropertyGroup> <GeneratePackageOnBuild>false</GeneratePackageOnBuild> </PropertyGroup> <!-- 条件:GeneratePackageOnBuild为true,或者正在执行Pack目标 --> <PropertyGroup Condition="'$(GeneratePackageOnBuild)' == 'true' OR '$(TargetsToBuild)' == 'Pack'"> <PackageIcon>favicon.ico</PackageIcon> <PackageReadmeFile>README.md</PackageReadmeFile> <PublishRepositoryUrl>true</PublishRepositoryUrl> <EmbedUntrackedSources>true</EmbedUntrackedSources> <IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat> </PropertyGroup> </Project>
验证方法
- 当项目里
GeneratePackageOnBuild=true时,执行dotnet build会自动打包,配置的属性生效。 - 当项目里
GeneratePackageOnBuild=false时,执行dotnet pack仍会启用这些属性,生成符合要求的包。
内容的提问来源于stack exchange,提问作者Allan Nielsen
相关产品推荐
相关产品推荐

