MSBuild /t:pack Nuget-Package始终具有相同的版本号

11

我正在使用TFS-Build创建一个包含/t:pack的NuGet包。由于我正在使用,因此无法使用Nuget-Pack-Step。

<TargetFramework>netstandard2.0</TargetFramework>

如何将我的AssemblyVersion应用于Nuget-Package?因为我的程序集版本是正确的,但我的Nuget版本始终保持1.0.0.0
请注意,我正在使用C#文件作为程序集信息,而不是.csproj文件。
是否有可能做到这一点?
想要分享这个链接

2
软件包版本来自您项目的“Version”标记,因此您应该尝试修改它。请参考链接 https://github.com/lextm/sharpsnmplib/blob/10.0.2/SharpSnmpLib/SharpSnmpLib.csproj#L26 - Lex Li
我正在使用AssemblyInfo.cs文件而不是csproj文件。但我找不到它的等效物。应该是类似于 [assembly: AssemblyVersion("4.0.0.0")] 的东西。 - Peter
现在虽然还没有,但是“应该会”有。如果你想的话,仍然可以使用.nuspec(因为我有一个项目使用了这个技巧)。 - Lex Li
2个回答

19

MSBuild集成的Pack目标从项目内的MSBuild属性中读取其值(具体来说是PackageVersion,默认值为Version,而Version又默认为VersionPrefix,后者可能会被VersionSuffix后缀)。请注意保留HTML标签。

新项目格式支持从程序集属性中读取此值,因为它们旨在使用与确定NuGet包元数据的配置相同的配置生成这些程序集属性。

但是,您可以通过向csproj文件添加自定义目标来扩展构建过程,在msbuild /t:Pack期间读取构建的程序集标识:

<Project>

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    <GenerateNuspecDependsOn>$(GenerateNuspecDependsOn);ReadPackageVersionFromOutputAssembly</GenerateNuspecDependsOn>
  </PropertyGroup>

  <Target Name="ReadPackageVersionFromOutputAssembly" DependsOnTargets="Build">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
      <Output TaskParameter="Assemblies" ItemName="PackAssembly" />
    </GetAssemblyIdentity>
    <PropertyGroup>
      <PackageVersion>%(PackAssembly.Version)</PackageVersion>
    </PropertyGroup>
  </Target>

</Project>

请注意,此目标仅在完整的MSBuild上运行,即Windows上的msbuild.exe(Visual Studio开发人员命令提示符)或Linux/Mac上的mono 5.2+。 这目前不适用于dotnet pack(MSBuild的.NET Core版本)。更新:自2018年跨平台版本的msbuild添加了GetAssemblyIdentity任务后,此功能现在可在.NET SDK 2.1.*及更高版本中使用。

非常棒的Martin。你花了好几个小时在这上面,你的解决方案完美地解决了问题。 - David D

9

在当前版本的MSBuild中,可以指定PackageVersion参数:

msbuild ProjectName.csproj -t:Pack -p:PackageVersion=1.2.3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接