为什么nuget认为1.2.3.4是稳定的发布版本?

问题描述

我在下面看到:

1.2.3          // release
1.2.3+hash     // release
1.2.3-alpha    // pre-release
1.2.3-alpha.12 // pre-release

1.2.3.4        // why is this release version and not pre-release version or invalid?
1.2.3.4.5      // invalid nuget version

我不明白为什么1.2.3.4被认为是以下任何地方提到的发行版本:

解决方法

预发行版本的定义是什么?

NuGet(主要是)符合SemVer2(在其网站上定义:https://semver.org/

第9节开始:https://semver.org/#spec-item-9

可以通过在补丁程序版本之后紧接附加连字符和一系列点分隔的标识符来表示预发行版本

但是SemVer2不允许使用4个细分版本

正确的,但是正如问题注释中的Joe Sewell所述,NuGet为其以前支持的内容添加了向后兼容性支持。实际上,这是在2011年向NuGet添加SemVer支持的提交:https://github.com/NuGet/NuGet2/commit/a999416414071f321f1ad5aa6d8c744ba0715e3a

从众多文件中我们可以看到,NuGet以前以前是使用System.Version作为软件包版本的,而从System.Version's docs中可以看到它包含此4段版本。 SemVer.cs的第一个版本包含the comment

SemVer的混合实现,支持http://semver.org中所述的语义版本控制,但不严格将其强制执行为 允许较旧的4位数版本控制方案继续工作。

此文件后来被重命名为SemanticVersion,随后又被拆分为NuGetVersion,扩展了严格等于2的SemanticVersion,但扩展了this comment still exists to this day

结论

因此,尽管SemVer2的预发布定义明确要求连字符必须紧跟补丁版本,但是向后兼容性阻止了NuGet(即使在最初发布仅1年之内)也只能完全遵循SemVer2。

因此,需要对SemVer2进行一些重新解释,并且选择是使连字符成为预释放信号,且不超过3个片段。 9年后,这就是我们所拥有的,nuget.org上有成千上万个使用4段版本的软件包,其中一些带有附加的预发行标签。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...