NuGet 包被标记为预发布

NuGet Package being marked as prerelease

我构建了一个 NuGet 包并将其上传到本地托管的 Sonatype Nexus 存储库。

我给它的版本是0.1.1+251019-020007-e3baff。我对 sem-ver 2.0 的理解是这应该被视为一个 stable/release 版本(因为 + 之后的数据应该只被视为元数据),但是 nuget 似乎变得混乱并且只显示它如果我在搜索中包含预发布版本。

例如在 cli 中,如果我 运行 Find-package <my-package-name> 我没有得到任何结果。但是如果我 运行 Find-Package -prerelease <my-package-name> 我得到

Id                  Versions     Description                                                                                                                                                                                                                                                                          
--                  --------     -----------                                                                                                                                                                                                                                                     
<my-package>        {0.1.1}      <description>

同样,如果我在 Visual Studio 中使用 GUI,我必须检查 "include prerelease" 选项,但是可用的版本标记为 "latest stable"...

在 Nexus 中有一个标记 "is_prerelease" 被某些东西设置为 true,不确定是什么,该标记是否被错误设置然后被用于搜索?

我还有什么地方做错了吗?我对 sem-ver 2.0 中的 + 字符的理解不正确吗?

我使用的是 NuGet 4.9.3 版本,nexus 是 3.19.0-01 版本

NuGet 的逻辑可作为包使用,NuGet.Versioning package 中的版本控制逻辑。使用这个小程序:

static void Main(string[] args)
{
    var version = NuGetVersion.Parse("0.1.1+251019-020007-e3baff");
    Console.WriteLine($"Version is prerelease: {version.IsPrerelease}");
}

我得到输出

Version is prerelease: False

我尝试了很多版本的 NuGet.Versioning 包,从最新的 5.3.1 到 4.9.4、4.3.0、3.5.0、3.2.0,甚至是包的最旧版本, 1.0.1.都说你的版本不是prerelease

因此,并不是 NuGet 认为您的包是预发布的。鉴于 - 是预发布标签的分隔符,我的猜测是 Nexus 错误地进行了类似于 version.Contains('-') 的简单检查以确定它是否是预发布。这是一种耻辱,因为 semver.org 在他们的网站上有两个没有这种行为的正则表达式(example,我不知道这个 link 将有效多久)。如果您的 Nexus 安装不是 运行 最新版本,我建议您尽可能尝试更新。如果仍然存在问题,您可以尝试联系软件供应商报告错误。

作为变通方法,您可以尝试避免在构建元数据中使用 - 字符,只要您继续使用 Nexus。 SemVer2 在允许您使用的字符方面受到很大限制,因此我建议改用 . (0.1.1+251019.020007.e3baff).