dotnet核心包版本控制

时间:2017-07-04 11:04:53

标签: git nuget .net-core csproj semantic-versioning

如何使用dotnet CLI为NuGet包(例如 MyCode.0.1.1.nupkg)生成基于Git中的标记的语义版本号?< / p>

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时?

2 个答案:

答案 0 :(得分:1)

  • <PackageVersion>中删除.csproj行。
  • 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>

答案 1 :(得分:0)

我为.NET Core项目版本here创建了一个CLI工具,我认为这样做可以满足您的需求。

在您的情况下,您将更改.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结合使用。

相关问题