dotnet 设置语义版本
dotnet set semantic version
有没有办法主动修改versioning of the .csproj
files using the dotnet
CLI? In the same way we can update the npm version.
我需要修改文件,我不是在寻找dotnet build -p:Version=1.2.3.4
。
或者例如使用 maven 你可以这样做: mvn versions:set -DnewVersion=1.2.3.4
这实际上更新了你的 pom.xml
.
试试这个:https://github.com/TAGC/dotnet-setversion
它使用XDocument
加载、修改和保存csproj文件。
为清楚起见,您要设置 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>
图一:Directory.Build.targets
如果您的所有项目都使用相同的版本号,这将非常有效。解决方案通常 使用相同的版本。如果他们不这样做,那么它就会变得有点棘手。尽管可以轻松地覆盖一个项目(或多个项目)中版本的一部分,但您表示这不是一个选项。另一种选择是使用自动生成的补丁值;也许基于日期。那么您永远不需要编辑值。
如果您的版本控制策略是通过这种方式集中管理的,那么恕我直言,使用任何文本编辑器修改单个数字的工作量与 运行 您还必须安装的一些 CLI 命令一样多. dotnet-setversion
工具提供了配置 JSON 文件的功能,这与更新本机 MSBuild XML 文件的工作量相同,只是不需要额外的工具。
Aside: Just my option, but I would not recommend setting a semantic version label as suggested by dotnet-setversion
. Instead, I would stick to the built-in --version-suffix
parameter. There are many ways to hook that up into your build process or use it imperatively on-demand as needed.
还值得注意的是,有许多护栏可以防止您偏离轨道。如果您使用非数字值,构建将失败。如果不小心忘记增加版本或使用重复的标签,发布将被拒绝。除非您使用自动生成方法,否则没有任何工具可以防止您忘记递增。
有没有办法主动修改versioning of the .csproj
files using the dotnet
CLI? In the same way we can update the npm version.
我需要修改文件,我不是在寻找dotnet build -p:Version=1.2.3.4
。
或者例如使用 maven 你可以这样做: mvn versions:set -DnewVersion=1.2.3.4
这实际上更新了你的 pom.xml
.
试试这个:https://github.com/TAGC/dotnet-setversion
它使用XDocument
加载、修改和保存csproj文件。
为清楚起见,您要设置 Assembly Version 还是 Semantic Version?语义版本只有 3 个数字部分:<major>.<minor>.<patch>
.
作为参考,这些是您可以通过 CLI 设置或传递的相关 MSBuild 属性:
Version
:整体版本;如果未设置 ,则默认为 AssemblyVersion
:汇编版本;默认为Version
FileVersion
:Win32文件版本;如果未设置 ,则默认为 VersionPrefix
:版本前缀;意在充当语义版本的数字部分;如果未设置 ,则默认为 VersionSuffix
:版本后缀;意味着作为语义版本的标签部分PackageVersion
:NuGet 包(例如语义)版本;如果两者都已设置,则默认为$(VersionPrefix)-$(VersionSuffix)
;否则,VersionPrefix
,可能默认为Version
1.0.0.0
AssemblyVersion
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>
图一:Directory.Build.targets
如果您的所有项目都使用相同的版本号,这将非常有效。解决方案通常 使用相同的版本。如果他们不这样做,那么它就会变得有点棘手。尽管可以轻松地覆盖一个项目(或多个项目)中版本的一部分,但您表示这不是一个选项。另一种选择是使用自动生成的补丁值;也许基于日期。那么您永远不需要编辑值。
如果您的版本控制策略是通过这种方式集中管理的,那么恕我直言,使用任何文本编辑器修改单个数字的工作量与 运行 您还必须安装的一些 CLI 命令一样多. dotnet-setversion
工具提供了配置 JSON 文件的功能,这与更新本机 MSBuild XML 文件的工作量相同,只是不需要额外的工具。
Aside: Just my option, but I would not recommend setting a semantic version label as suggested by
dotnet-setversion
. Instead, I would stick to the built-in--version-suffix
parameter. There are many ways to hook that up into your build process or use it imperatively on-demand as needed.
还值得注意的是,有许多护栏可以防止您偏离轨道。如果您使用非数字值,构建将失败。如果不小心忘记增加版本或使用重复的标签,发布将被拒绝。除非您使用自动生成方法,否则没有任何工具可以防止您忘记递增。