MSBuild PropertyGroup 正常运行,除非它作为 NuGet 道具文件被拉入

MSBuild PropertyGroup operates properly unless it is pulled in as a NuGet props file

我创建了一个 NETStandard 2.0 项目。围绕生成 NuGet 包的工具支持工作正常;我可以设置 VersionDescription 等。我想做的是扩展我的项目以支持一种自动生成预发布版本的方法出色地。我想出的解决方案是对我的 csproj 文件进行以下修改:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageId>MyCompany.MyLibrary</PackageId>
    <Authors>MyCompany</Authors>
    <Version>1.1.8</Version>
  </PropertyGroup>

  <!-- Support Prerelease Versioning -->
  <PropertyGroup Condition="$(IsPrerelease) == true">
    <CurrentDate>$([System.DateTime]::Now.ToString(yyyyMMdd-HHmmss))</CurrentDate>
    <VersionSuffix>CI-$(CurrentDate)</VersionSuffix>
    <Version Condition="'$(Version)' != ''">$(Version)-CI-$(CurrentDate)</Version>
  </PropertyGroup>
</Project>

这很好用,特别是因为预发布 PropertyGroup 遵循 Visual Studio 生成的 PropertyGroup。如果 Version 是 1.0.0,Visual Studio 删除 属性 因为默认使用 1.0.0,所以 VersionSuffix 将正常工作。但是,如果 Visual Studio 设置 Version (1.1.8),那么我需要替换 属性 的值(如上所示)。

执行此操作时,msbuild 仅在未指定 Version 的情况下才能正常运行:


我的下一步是提取额外的 PropertyGroup 并创建一个 NuGet 包:MyCompany.Packaging.Prerelease,它有一个 .props 文件。问题是,如果指定了 Version,它会忽略我正在覆盖该值的事实,即使我指定了 /p:IsPrerelease=true它生成 1.1.8.nupkg。我不确定为什么,但我觉得我误解了包含 NuGet target/props 文件的方式;我假设会附加 NuGet target/props。

我不确定我可以做些什么来改变我的 MSBuild,以便我的预发布版本控制部分能够在作为NuGet 包。

感谢 imps 的评论,我更新了我的 props/targets 以更新 PackageVersion 属性 而不是试图覆盖 版本属性; PackageVersion 是 NuGet 包的首选元数据,如果 PackageVersion 不是,它只会回退到 Version放。此外,我使用了自定义 Target,它将 运行 优先于 Build 目标。

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Condition="$(IsPrerelease) == true" Name="Prerelease" BeforeTargets="Build">
    <PropertyGroup>
      <DateTimeFormat>$([System.DateTime]::Now.ToString(yyyyMMdd-HHmmss))</DateTimeFormat>
      <PackageVersion>$(Version)-CI-$(DateTimeFormat)</PackageVersion>
    </PropertyGroup>
  </Target>
</Project>

msbuild MySolution.sln /p:IsPrerelease=true 现在将改为生成预发布的 NuGet 包。