如何根据引用的PackageReference版本动态设置C#项目Version属性
从PackageReference同步版本到项目Version属性
要实现将指定PackageReference的Version同步到项目自身的Version属性,关键是要在MSBuild正确的执行时机里获取包的版本值——因为PackageReference的元数据解析是在特定目标阶段完成的,直接在PropertyGroup中引用会因为时机不对拿不到值。
以下是可行的配置方案:
<PropertyGroup> <!-- 初始留空,后续通过目标赋值 --> <Version></Version> </PropertyGroup> <ItemGroup> <PackageReference Include="A" Version="1.2.3.4" /> </ItemGroup> <Target Name="SyncPackageAVersionToProject" BeforeTargets="PrepareForBuild"> <!-- 过滤出引用的包"A" --> <ItemGroup> <TargetPackage Include="@(PackageReference)" Condition="'%(PackageReference.Identity)' == 'A'" /> </ItemGroup> <!-- 将包的Version赋值给项目Version --> <PropertyGroup Condition="'@(TargetPackage)' != ''"> <Version>%(TargetPackage.Version)</Version> </PropertyGroup> </Target>
说明
BeforeTargets="PrepareForBuild":确保目标在项目版本被确定之前执行,此时PackageReference的元数据已经完成解析,能正确获取到Version值。- 通过
Condition过滤出指定的包"A",避免其他包干扰。 - 如果包"A"存在,就将其Version赋值给项目的Version属性;如果不存在,Version会保持初始空值(可根据需要添加默认值)。
验证方法
执行dotnet build后,查看生成的程序集文件属性,或运行dotnet msbuild /t:SyncPackageAVersionToProject /p:verbosity=detailed,在输出中可以看到Version属性已被正确赋值。
内容的提问来源于stack exchange,提问作者Roy Guggenheim
相关产品推荐
相关产品推荐

