2017-11-10 70 views
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

注意,正在通过拉PackageVersion是为ProjectReference默认,而项目本身与发现包建设版。

我试过改变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

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

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