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

如何在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:57:48