使用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
相关产品推荐
相关产品推荐

