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

使用MSBuild构建NuGet包时如何复用项目程序集信息?

解决MSBuild从程序集提取信息生成NuGet包的问题

核心问题分析

你当前的实现存在三个关键问题:

  • $(MyAssemblies)未定义,MSBuild无法定位要读取的程序集文件
  • Target未绑定到正确的构建阶段,NuGet包生成逻辑会在你的RetrieveIdentities执行前完成,导致配置无法生效
  • 无法直接在PropertyGroup中使用%(MyAssemblyIdentities.Version)这种Item元数据,必须通过任务将其转换为全局MSBuild属性

完整解决方案

步骤1:修改Target,绑定执行时机并提取程序集信息

将你的RetrieveIdentities Target修改为以下内容,确保它在NuGet包生成前执行,并且正确读取项目编译后的主程序集:

<Target Name="RetrieveAssemblyInfoForNuGet" 
        DependsOnTargets="Build"
        BeforeTargets="GenerateNuGetPackage">
  <!-- 定位项目编译后的主程序集 -->
  <GetAssemblyIdentity AssemblyFiles="$(OutputPath)$(AssemblyName).dll">
    <Output TaskParameter="Assemblies" ItemName="MyAssemblyIdentities"/>
  </GetAssemblyIdentity>

  <!-- 将程序集元数据转换为全局MSBuild属性 -->
  <CreateProperty Value="%(MyAssemblyIdentities.Version)">
    <Output TaskParameter="Value" PropertyName="PackageVersion"/>
  </CreateProperty>
  <CreateProperty Value="%(MyAssemblyIdentities.Title)">
    <Output TaskParameter="Value" PropertyName="PackageId"/>
  </CreateProperty>
  <CreateProperty Value="%(MyAssemblyIdentities.Description)">
    <Output TaskParameter="Value" PropertyName="Description"/>
  </CreateProperty>
  <CreateProperty Value="%(MyAssemblyIdentities.Company)">
    <Output TaskParameter="Value" PropertyName="Authors"/>
  </CreateProperty>

  <!-- 可选:打印调试信息,验证提取结果 -->
  <Message Text="提取的程序集版本: $(PackageVersion)" Importance="High"/>
  <Message Text="提取的程序集标题: $(PackageId)" Importance="High"/>
</Target>

步骤2:调整NuGet配置PropertyGroup

去掉原PropertyGroup中硬编码的PackageId、PackageVersion、Authors、Description,让它们自动从Target生成的属性中获取。如果需要保留默认值,可以添加Condition判断:

<PropertyGroup>
  <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  <!-- 保留其他不需要从程序集提取的配置 -->
  <PackageIcon>Hugh.png</PackageIcon>
  <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
  <PackageTags>test</PackageTags>
  <PackageReleaseNotes>Update.</PackageReleaseNotes>
  <copyright>Copyright © 2021 </copyright>
  
  <!-- 可选:添加默认值,当程序集信息提取失败时生效 -->
  <PackageId Condition=" '$(PackageId)' == '' ">Test</PackageId>
  <PackageVersion Condition=" '$(PackageVersion)' == '' ">1.0.0.0</PackageVersion>
  <Authors Condition=" '$(Authors)' == '' ">Hugh</Authors>
  <Description Condition=" '$(Description)' == '' ">test</Description>
</PropertyGroup>

关键细节说明

  • DependsOnTargets="Build":确保程序集已经编译完成,才能读取到最新的程序集信息
  • BeforeTargets="GenerateNuGetPackage":强制Target在NuGet包生成逻辑执行前运行,保证属性已被正确赋值
  • $(OutputPath)$(AssemblyName).dll:这是项目编译后主程序集的默认路径,$(AssemblyName)是项目文件中定义的程序集名称(如果没改就是项目名)
  • CreateProperty任务:将Item的元数据(%(MyAssemblyIdentities.Xxx))转换为全局可访问的MSBuild属性($(Xxx)),这样NuGet配置就能直接引用

内容的提问来源于stack exchange,提问作者DevOpS_PRO_Pro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:25:23