2017-07-04 142 views
2

如何使用dotnet CLI根据Git中的标签为NuGet包生成语义版本号(,例如 MyCode.0.1.1.nupkg)?dotnet核心包版本

GitInfo正确地版本化我们的程序集,但我想将其扩展到版本控制我们的NuGet程序包。以下是我们的.csproj代码片段:

<Project Sdk="Microsoft.NET.Sdk"> 
    <PropertyGroup> 
    <TargetFramework>netcoreapp1.1</TargetFramework> 
    <GenerateAssemblyInfo>False</GenerateAssemblyInfo> 
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild> 
    <PackageVersion>$(GitSemVerMajor).$(GitSemVerMinor).$(GitSemVerPatch)$(GitSemVerDashLabel)</PackageVersion> 
    </PropertyGroup> 
    <ItemGroup> 
    <Compile Include="..\..\GlobalAssemblyInfo.cs" Link="Properties\AssemblyInfo.cs" /> 
    </ItemGroup> 
    <ItemGroup> 
    <PackageReference Include="gitinfo" Version="1.1.66" /> 
    </ItemGroup> 
</Project> 

请注意GeneratePackageOnBuild

我该怎么做才能生成这些构建变量,$(GitSemVerMajor),。我打电话给dotnet build

回答

1
  • .csproj中删除<PackageVersion>行。
  • 添加InitialTargets语句来Project
    <Project Sdk="Microsoft.NET.Sdk" InitialTargets="SetVersion">
  • 添加Import的版本控制目标文件:
    <Import Project="..\..\Version.targets" />

Version.targets文件:

<?xml version="1.0" encoding="utf-8"?> 
<Project 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
     <Target Name="GitVersion"> 
     <PropertyGroup> 
      <!-- Dummy values allow dotnet restore to progress --> 
      <GitBaseVersionMajor>0</GitBaseVersionMajor> 
      <GitBaseVersionMinor>1</GitBaseVersionMinor> 
      <GitBaseVersionPatch>0</GitBaseVersionPatch> 
      <GitCommits>0</GitCommits> 
     </PropertyGroup> 
    </Target> 
    <Target Name="SetVersion" DependsOnTargets="GitVersion"> 
     <PropertyGroup> 
      <!-- CI checkouts may be against a specific commit, not a branch, so add -pr as label --> 
      <GitSemVerDashLabel Condition="'$(GitBranch)' == 'undefined'">$(GitSemVerDashLabel)-pr</GitSemVerDashLabel> 
      <!-- If there's no label, but we're not at the tip of the base version, add a -pre because this is not the base build --> 
      <GitSemVerDashLabel Condition="'$(GitSemVerDashLabel)' == '' And '$(GitCommits)' != '0'">-pre</GitSemVerDashLabel> 
      <PackageVersion Condition="'$(GitSemVerDashLabel)' == ''">$(GitBaseVersionMajor).$(GitBaseVersionMinor).$(GitBaseVersionPatch)</PackageVersion> 
      <PackageVersion Condition="'$(GitSemVerDashLabel)' != ''">$(GitBaseVersionMajor).$(GitBaseVersionMinor).$(GitBaseVersionPatch)$(GitSemVerDashLabel).$(GitCommits)</PackageVersion> 
      <AssemblyVersion>$(GitBaseVersionMajor).$(GitBaseVersionMinor).$(GitBaseVersionPatch)</AssemblyVersion> 
     </PropertyGroup> 
    </Target> 
</Project> 
0

我做了一个CLI .NET Core项目版本化工具here我认为这是你想要的。

你的情况,你会改变你的.csproj文件,以引用CLI工具和省略Version元素:

<Project Sdk="Microsoft.NET.Sdk"> 
    <PropertyGroup> 
    <TargetFramework>netcoreapp1.1</TargetFramework> 
    <GenerateAssemblyInfo>False</GenerateAssemblyInfo> 
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild> 
    </PropertyGroup> 
    <ItemGroup> 
    <Compile Include="..\..\GlobalAssemblyInfo.cs" Link="Properties\AssemblyInfo.cs" /> 
    </ItemGroup> 
    <ItemGroup> 
    <PackageReference Include="gitinfo" Version="1.1.66" /> 
    </ItemGroup> 
    <ItemGroup> 
    <DotNetCliToolReference Include="dotnet-setversion" Version="*" /> 
    </ItemGroup> 
</Project> 

要生成NuGet包使用特定的版本,你只需cd到项目目录并运行dotnet restore && dotnet setversion <<SOME_VERSION>>

这会Version元素添加到.csproj文件,以便今后任何的dotnet builddotnet package等调用将把该项目作为具有特定版本。这在CI构建期间特别有用,您可能希望在每次运行时自动增加版本号。

对于完整的披露,我不熟悉GitInfo,所以我很抱歉,如果这不适用于您的情况。如果两者之间有任何相似之处,我个人将此工具与GitVersion一起使用。