在DNCore Pack期间更改“Referencee”$(PackageVersion)

时间:2017-11-10 21:18:00

标签: .net-core nuget-package msbuild-4.0

我正在尝试使用MSBuild根据分支名称自动更新包版本。这适用于项目本身,但引用的项目(使用相同的MSBuild目标)使用默认版本 - 这意味着我的目标没有运行。例如,假设我有以下项目:

  • ConsoleApp1
    • ProjectReference:ClassLibrary1
  • ClassLibrary1的

在构建上述内容时,我得到以下nuspec / nugets:

  • ConsoleApp1 version 0.0.2-beta00001
    • dependency id="ClassLibrary1" version="1.0.0"
  • ClassLibrary version 0.0.2-beta00001

请注意,正在提取的PackageVersionProjectReference的默认值,而项目本身是使用发现的包版本构建的。

我尝试更改GetTargetPathDependsOn以及BeforeTargets="GetTargetPath;GetProjectsReferencingProjectJson"(在Nuget Pack MSBuild中进行了调整后),但它们似乎没有效果。

<PropertyGroup>
  <BuildDependsOn>
    OverridePackageVersion;
    $(BuildDependsOn);
  </BuildDependsOn>
  <GetTargetPathDependsOn>
    OverridePackageVersion;
    $(GetTargetPathDependsOn);
  </GetTargetPathDependsOn>
</PropertyGroup>

<Target Name="OverridePackageVersion"
        BeforeTargets="GetTargetPath;GetProjectsReferencingProjectJson"
        DependsOnTargets="GetDefaultVersion">

  <CreateProperty
    Value=""
    Condition="'$(AutoPackagePreName)'=='$(ReleaseBranchName)'">
    <Output TaskParameter="Value" PropertyName="AutoPackagePreName" />
  </CreateProperty>

  <CreateProperty
    Value="$([System.String]::Format( $(AutoPackagePreNumberFormat), $([MSBuild]::Add($(AutoPackagePreNumber), 0)) ))">
    <Output TaskParameter="Value" PropertyName="AutoPackagePreNumber" />
  </CreateProperty>

  <!-- Final Override -->

  <CreateProperty
    Value="$(AutoPackageVersion)"
    Condition="'$(AutoPackagePreName)'==''">
    <Output TaskParameter="Value" PropertyName="PackageVersion" />
  </CreateProperty>

  <CreateProperty
    Value="$(AutoPackageVersion)-$(AutoPackagePreName)$(AutoPackagePreNumber)"
    Condition="'$(AutoPackagePreName)'!=''">
    <Output TaskParameter="Value" PropertyName="PackageVersion" />
  </CreateProperty>

  <CreateProperty
    Value="$(PackageVersion)"
    Condition="'$(UpdateVersion)'=='true'">
    <Output TaskParameter="Value" PropertyName="Version" />
  </CreateProperty>

  <Message Importance="High" Text="Selected package version $(PackageVersion)." />

</Target>

这是完全可能的,还是我将不得不在我的CI中使用Powershell?

The full source is available.

1 个答案:

答案 0 :(得分:1)

您之前需要为最近的NuGet和.NET Core 2. * SDK版本运行的目标是CollectPackageReferences;PrepareForBuild。为了让它在旧版本中运行,我还使用了Restore;_GenerateRestoreProjectSpec,但在最近的工具上不再需要这些。请参阅我的Directory.Builds.targets我正在使用创建公共NuGet包。

目前,依赖包版本在还原期间被锁定并从obj\project.assets.json文件中读取,这就是使用特定于还原的目标的原因。请注意,还原不会从NuGet包导入props / targets文件,因此您当前无法通过包含适用于项目到项目引用的构建资产的NuGet包来使用版本控制逻辑。请参阅the GitHub issue for it - 计划似乎是从阅读资产文件转到重新评估引用项目中的版本,而不是在恢复期间将其锁定。