定义控制台应用程序版本,并从应用程序引用版本信息。

4

我有一个.NET 5.0控制台应用程序。如何创建版本资源并在我的应用程序中显示该版本?

过去,我见过AssemblyInfo.cs文件。但我在新项目中没有看到类似的东西。


你不需要为此使用资源。版本信息是通过项目文件中的各种项目属性来指定的。这些属性可以通过在例如dotnet build中传递显式值来覆盖。还可以使用表达式计算基于日期的值等。我使用<VersionSuffix>$([System.DateTime]::UtcNow.ToString(yyyyMMdd-HHmm))</VersionSuffix>出于这个原因。 - Panagiotis Kanavos
1
重复是不正确的。没有必要创建AssemblyInfo.cs来指定版本属性。这在csproj中完成。 - Panagiotis Kanavos
@PanagiotisKanavos 这个重复问题(https://dev59.com/o1gQ5IYBdhLWcg3w1nfm)是关于csproj指定版本的方法。这个问题与那个问题是重复的,如果除了现有答案之外还有其他解决办法,那么应该在那个问题上添加答案。 - mason
1
@mason 这不是一个好的重复问题。那里的大多数答案都展示了如何生成 AssemblyInfo.cs,而不是如何使用项目属性。这包括获得 381 个赞的被接受答案。只有那些已经知道答案的人才会意识到正确的答案是这个 - Panagiotis Kanavos
@PanagiotisKanavos 这个答案 展示了使用 csproj 的技巧。如果您有额外的信息,那么应该将其编辑到该问题的现有答案中,或在该问题上发布一个新的答案。这个问题仍然是那个问题的重复。 - mason
@mason,这就是为什么这是一个糟糕的重复。这是第六个答案。当大多数先前的答案都说“生成assembylinfo”时,任何人怎么会意识到这是正确的答案呢?一个好的重复,就像一个好的答案一样,应该能够自己站立,而不需要解释为什么答案不是答案。 - Panagiotis Kanavos
1个回答

5
我最近不得不解决这个问题:如何知道工具的哪个版本已部署?如何自动化版本号,以便不会意外使用旧版本?
过去,这些信息存储在 AssemblyInfo.cs 的属性中。在 .NET Core 中,这些属性现在由项目属性在运行时生成。 Andrew Lock 解释了各种属性的用法,例如 Version、VersionPrefix、VersionSuffix、AssemblyVersion、FileVersion、PackageVersion 和 InformationalVersion。
最重要的是 Version、VersionPrefix 和 VersionSuffix。因为 Version 用作其他属性的默认值。如果没有显式值,则可以将 Version 计算为 VersionPrefix-VersionSuffix。
引用文章中的话:
“Version”属性是构建.NET Core应用程序时最常设置的值。它控制构建输出中所有版本号的默认值,例如“PackageVersion”和“AssemblyVersion”,因此通常被用作应用程序/库版本的单一来源。
如果使用System.Commandline,则通过“--version”显示的版本信息是“InformationalVersion”,其默认值来自“Version”。
默认的“VersionPrefix”是“1.0.0”,后缀为空,导致版本为“1.0.0”。
*公式
好处在于这些属性可以有公式。我能够通过将这个公式添加到不包含其他版本信息的“csproj”中,自动生成与日期相关的版本号。
<VersionSuffix>$([System.DateTime]::UtcNow.ToString(`yyyyMMdd-HHmm`))</VersionSuffix>

每次我现在构建我的工具,我会得到像 1.0.0-2021061501836 这样的版本号。 覆盖属性 项目值可以在构建过程中被覆盖,可以通过指定显式版本后缀或为项目属性指定显式值来实现。例如:
dotnet build --configuration Release --version-suffix preview2-final

或者

dotnet build --configuration Release /p:Version=1.2.3-preview2-final

这样,自动化的发布流程可以指定一个新版本来覆盖项目文件中设置的任何内容。

谢谢,太糟糕了,没有自动增量内置。我不确定我喜欢你的日期后缀方法的外观。此外,我不是很清楚版本通常如何从1.0.0更改。 - Jonathan Wood
1
@JonathanWood 你可以直接设置“Version”或“VersionPrefix”,至于自增,你需要将旧版本存储在某个位置并提交到源代码控制中——否则构建服务器无法递增。这可能会很麻烦。递增值也不能告诉你很多关于构建的信息。通常使用短的Git哈希作为后缀,比如“0.1.11-g0c85fbc”,它告诉你应用程序是从哪个提交版本生成的,并且可以在 Git 中进行搜索。 - Panagiotis Kanavos
问题的第一部分得到了出色的回答,对于另一个部分“然后在我的应用程序中显示该版本?”的答案是:Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion。 - Darren J. McLeod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接