如何在.csproj属性中引用NuGet包的版本号?
如何在.csproj中引用NuGet包版本号并复用
问题场景
我在.NET项目中使用Sample.Package NuGet包,希望在.csproj文件的属性里引用它的版本号,方便在文件其他部分复用。尝试过以下代码但项目加载失败:
<PropertyGroup> <MyPackageVersionProperty>$([System.String]::Copy('$(PackageReference.PackageName.Version)'))</MyPackageVersionProperty> </PropertyGroup>
当前csproj示例如下,每次更新Sample.Package时都需要手动修改NuGetPackagePath中的版本号,希望实现自动同步:
<Project Sdk="Microsoft.NET.Sdk.Web" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <GenerateDocumentationFile>true</GenerateDocumentationFile> </PropertyGroup> <ItemGroup> <PackageReference Include="Sample.Package" Version="1.2.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> </ItemGroup> <PropertyGroup> <!-- 每次更新包时我都需要手动修改下方的版本号,希望能实现自动更新。 --> <NuGetPackagePath>$([System.IO.Path]::Combine($(NuGetPackageRoot), "Sample.Package", "1.2.3"))</NuGetPackagePath> </PropertyGroup> <ItemGroup> <Content Include="$(NuGetPackagePath)\lib\net461\xmlFromPackage.xml" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup> </Project>
解决方案
方法一:提前定义版本变量(推荐)
直接在PropertyGroup中定义版本变量,然后在PackageReference和后续路径中复用,只需修改一处即可同步所有引用:
<Project Sdk="Microsoft.NET.Sdk.Web" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <GenerateDocumentationFile>true</GenerateDocumentationFile> <!-- 定义版本变量 --> <SamplePackageVersion>1.2.3</SamplePackageVersion> </PropertyGroup> <ItemGroup> <!-- 引用变量作为包版本 --> <PackageReference Include="Sample.Package" Version="$(SamplePackageVersion)" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> </ItemGroup> <PropertyGroup> <!-- 复用版本变量生成路径 --> <NuGetPackagePath>$([System.IO.Path]::Combine($(NuGetPackageRoot), "Sample.Package", "$(SamplePackageVersion)"))</NuGetPackagePath> </PropertyGroup> <ItemGroup> <Content Include="$(NuGetPackagePath)\lib\net461\xmlFromPackage.xml" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup> </Project>
方法二:从已添加的PackageReference中提取版本
若不想提前定义变量,可使用MSBuild的GetPackageVersion任务(需MSBuild 16.0+/Visual Studio 2019及以上),从项目的project.assets.json中读取已解析的包版本:
<Project Sdk="Microsoft.NET.Sdk.Web" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <GenerateDocumentationFile>true</GenerateDocumentationFile> </PropertyGroup> <ItemGroup> <PackageReference Include="Sample.Package" Version="1.2.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> </ItemGroup> <!-- 提取Sample.Package的版本号并设置路径变量 --> <Target Name="GetSamplePackageVersion" BeforeTargets="BeforeBuild"> <GetPackageVersion PackageName="Sample.Package" ProjectAssetsFile="$(ProjectAssetsFile)"> <Output TaskParameter="Version" PropertyName="SamplePackageVersion" /> </GetPackageVersion> <PropertyGroup> <NuGetPackagePath>$([System.IO.Path]::Combine($(NuGetPackageRoot), "Sample.Package", "$(SamplePackageVersion)"))</NuGetPackagePath> </PropertyGroup> </Target> <ItemGroup> <Content Include="$(NuGetPackagePath)\lib\net461\xmlFromPackage.xml" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup> </Project>
注意事项
你之前尝试的$(PackageReference.PackageName.Version)写法不符合MSBuild语法,这是导致项目加载失败的原因,MSBuild没有这种直接访问PackageReference元数据的方式。
内容的提问来源于stack exchange,提问作者Gabriel Kunkel
相关产品推荐
相关产品推荐

