dotnet 设置语义版本

Posted

技术标签:

【中文标题】dotnet 设置语义版本【英文标题】:dotnet set semantic version 【发布时间】:2021-11-05 06:11:21 【问题描述】:

有没有办法使用dotnet CLI 主动修改.csproj 文件中的versioning?同样的方式我们可以更新npm version。

我需要修改文件,我不是在找dotnet build -p:Version=1.2.3.4

或者,例如使用 maven,您可以这样做:mvn versions:set -DnewVersion=1.2.3.4 实际上会更新您的 pom.xml

【问题讨论】:

您是否接受在构建时使用 CLI 参数设置版本,还是真的需要修改 .csproj 文件? 我实际上需要修改.csproj文件。我知道dotnet build -p:Version=1.2.3.4 csproj 文件是 XML 文件。像编辑任何其他 XML 文件一样编辑它们。 我想要一个可以做到这一点的工具,我不想手动打开和编辑 XML 文件,也不想为此创建脚本。我添加了带有npmmvn 的示例,它们可以完成此任务。 试试这个:github.com/TAGC/dotnet-setversion 它使用XDocument 来加载、修改和保存csproj文件。 【参考方案1】:

试试这个:https://github.com/TAGC/dotnet-setversion

它使用XDocument来加载、修改和保存csproj文件。

【讨论】:

【参考方案2】:

为了清楚起见,您要设置 Assembly Version 还是 Semantic Version?语义版本只有 3 个数字部分:<major>.<minor>.<patch>

作为参考,这些是您可以通过 CLI 设置或传递的相关 MSBuild 属性:

Version:整体版;如果未设置,则默认为 1.0.0.0 AssemblyVersion:汇编版本;默认为Version FileVersion:Win32文件版本;如果未设置,则默认为 AssemblyVersion VersionPrefix:版本前缀;意在充当语义版本的数字部分;如果未设置,则默认为 Version VersionSuffix:版本后缀;旨在作为语义版本的标签部分 PackageVersion:NuGet 包(例如语义)版本;如果两者都设置,则默认为$(VersionPrefix)-$(VersionSuffix);否则,VersionPrefix,可能默认为Version

dotnet pack --version-suffix beta.1 等价于dotnet pack -p:VersionSuffix=beta.1

无论您尝试设置哪个版本(甚至可能同时设置),我都建议您尽可能使用本机 MSBuild,因为它可以简化流程。如果您想在一个地方管理版本,您可以使用 Directory.Build.targets 轻松做到这一点。

例如,假设您的源布局是:

└─ src
    ├─ Project1
    ├─ Project2
    └─ Project3

通过添加文件src/Directory.Build.targets所有项目将自动导入文件没有任何修改(例如零接触)。

有很多方法可以配置它,但它可能看起来像:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    
    <MajorVersion Condition=" '$(MajorVersion)' == '' ">1</MajorVersion>
    <MinorVersion Condition=" '$(MinorVersion)' == '' ">0</MinorVersion>
    <PatchVersion Condition=" '$(PatchVersion)' == '' ">0</PatchVersion>

    <VersionPrefix Condition=" '$(VersionPrefix)' == '' ">$(MajorVersion).$(MinorVersion).$(PatchVersion)</VersionPrefix>
    <AssemblyVersion Condition=" '$(AssemblyVersion)' == '' ">$(VersionPrefix).0</AssemblyVersion>
    
    <!-- replicates the old behavior of <major>.<minor>.* (ex: 1.0.*) in AssemblyInfo.cs -->
    <DaylightSavingTime>$([System.DateTime]::Now.IsDaylightSavingTime())</DaylightSavingTime>
    <FileBuildNumber>$([System.DateTime]::Today.Subtract($([System.DateTime]::Parse("1/1/2000"))).ToString("%d"))</FileBuildNumber>
    <FileBuildRevision Condition=" '$(DaylightSavingTime)' == 'True' " >$([System.Convert]::ToInt32($([MSBuild]::Divide($([System.DateTime]::Now.Subtract($([System.TimeSpan]::FromHours(1.0))).TimeOfDay.TotalSeconds),2))))</FileBuildRevision>
    <FileBuildRevision Condition=" '$(DaylightSavingTime)' == 'False' " >$([System.Convert]::ToInt32($([MSBuild]::Divide($([System.DateTime]::Now.TimeOfDay.TotalSeconds),2))))</FileBuildRevision>
    <FileVersion>$(MajorVersion).$(MinorVersion).$(FileBuildNumber).$(FileBuildRevision)</FileVersion>

  </PropertyGroup>

</Project>

图 1:Directory.Build.targets

如果您的所有项目都使用相同的版本号,这将非常有效。解决方案通常使用相同的版本。如果他们不这样做,那么它会变得有点棘手。尽管可以轻松地覆盖项目(或多个项目)中版本的一部分,但您表示这不是一种选择。另一种选择是使用自动生成的补丁值;也许基于日期。那么您将永远不需要编辑值。

如果您的版本控制策略以这种方式集中管理,那么恕我直言,使用任何文本编辑器修改单个数字与运行您还必须安装的某些 CLI 命令一样多。 dotnet-setversion 工具提供了配置 JSON 文件的功能,这与更新本机 MSBuild XML 文件的工作量相同,尽管不需要额外的工具。

旁白:只是我的选择,但我不建议按照dotnet-setversion 的建议设置语义版本标签。相反,我会坚持使用内置的 --version-suffix 参数。有很多方法可以将其连接到您的构建过程中,或者根据需要按需使用它。

还值得注意的是,有许多护栏可以防止您偏离轨道。如果您使用非数字值,则构建将失败。如果不小心忘记增加版本或使用重复标签,发布将被拒绝。除非您使用自动生成方法,否则没有任何工具可以防止您忘记递增。

【讨论】:

以上是关于dotnet 设置语义版本的主要内容,如果未能解决你的问题,请参考以下文章

dotnet 核心包版本控制

考古 dotnet 的不同版本

使用 xunit 在 webapi 应用程序上运行 dotnet 测试

在 dotnet core SDK 版本之间切换

与版本 5 包一起安装 dotnet 6 preview 6 RPM 包

powershell 检测DotNet Framework版本