通过 bash 获取编译/发布的 dotnet 应用程序的版本信息

boo*_*oot 5 c# linux .net-core

我正在开发一个 ASP.Net Core 项目,其中.csproj文件如下所示:

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>netcoreapp2.0</TargetFramework>
    <PreserveCompilationContext>true</PreserveCompilationContext>
    <AssemblyName>dummyapp</AssemblyName>
        <Version>17.12.1</Version>
    <RuntimeIdentifiers>centos.7-x64;win7-x64</RuntimeIdentifiers>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

当此应用程序针对Windows发布时,我可以从其属性中获取版本信息。其中显示17.12.1如上所述。

或者,我可以wmic datafile where name="filepath/app.exe" get Version /value使用命令提示符运行并获取相同的版本。


但是有没有一种标准的方法可以在 linux 发行版中获得相同的结果?

我调查过:

经过所有试验,似乎我需要在.csproj文件中实现其他内容,以便使用bash获取版本信息。有人可以指出需要做什么,或给出相同的提示。


Main 方法:

public static void Main(string[] args)
{
    var root = new Root();
    var config = new ConfigurationBuilder()
                     .SetBasePath(Directory.GetCurrentDirectory())
                     .AddJsonFile(SettingsFilename, optional: false,
                                  reloadOnChange: true)
                     .AddEnvironmentVariables()
                     .Build();

    config.Bind(root);

    //some codes

    var host = new WebHostBuilder()
                    .UseKestrel()
                    .UseUrls(root.AppUrl)
                    .UseConfiguration(config)
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .ConfigureServices(s =>
                                     s.AddRouting().DetectTokenChange(config))
                    .UseSetting(WebHostDefaults.ApplicationKey, "dummyapp")
                    .Configure(app => app.UseRouter(r => r.MapPost("dumptoqueue", 
                                      async (context) => 
                                      await Task.Run(() => AddtoQueue(context)))))
                    .Build();
     host.Run();
}
Run Code Online (Sandbox Code Playgroud)

使用命令行构建的应用程序:

dotnet publish -c release -r centos.7-x64
Run Code Online (Sandbox Code Playgroud)

Oma*_*jid 5

exiftool如果您只需通过 bash 查找 dll 文件的版本,它可能更易于使用。

$ exiftool Foo.dll | grep -i Version
ExifTool Version Number         : 10.55
Linker Version                  : 48.0
OS Version                      : 4.0
Image Version                   : 0.0
Subsystem Version               : 4.0
File Version Number             : 17.12.1.0
Product Version Number          : 17.12.1.0
File Version                    : 17.12.1.0
Product Version                 : 17.12.1
Assembly Version                : 17.12.1.0
Run Code Online (Sandbox Code Playgroud)

或者甚至只是:

$ exiftool -"ProductVersion" Foo.dll 
Product Version                 : 17.12.1
Run Code Online (Sandbox Code Playgroud)


Bas*_*tch 2

首先,我们假设您的 Linux 程序已编译为yourprog 可执行文件,并且您正在从其源代码构建它(因此您可以稍微更改源代码和构建过程)。您的构建过程是什么,或者您使用什么编程语言进行编码并不重要。该yourprog文件可能是一些ELF可执行文件或可由execve(2)系统调用理解的其他文件(例如脚本)。使用file(1)(例如 as )file yourprog来找出其文件格式。另请参阅binfmt_misc并阅读( #!shebang)。请注意,每个应用程序都是由某些程序启动的execve(通常由您的Unix shell完成,但也可能由其他程序完成,例如systemd)。

您可以在该可执行文件上使用strings(1)strings ./yourprog;然后您将获得其中的大部分多字节字符串。可能其中一些(许多)字符串包含版本信息(如果它已在编译阶段放在那里)。

关于--version,它应该是您的程序遵循的约定。这个答案。因此,应该改进源代码,以便您的程序能够处理--version--help 程序参数。没有涉及任何魔法,您必须对其进行编码(也许您的构建自动化可以生成一些包含版本字符串的 C# 代码;如何完成是一个不同的问题,并且取决于您使用的特定构建实用程序;与或makeninja'只需添加一些特定规则,例如在您的Makefile或您的build.ninja)中。因此,您需要了解并改进您的构建过程。如果您使用 C# 进行编码,则需要从您的 中处理该问题Main,因此您需要改进您的Main 解析和args 适当处理(在 Windows 上,可能是其他东西)。顺便说一句,恕我直言,即使在其他操作系统上,能够传递一些程序参数来查询版本并获得帮助也是有帮助的(我不知道Windows,但也许它可能是and而不是and )。--help--version/version/help--version--help

请注意,软件版本控制始终是人类约定(即使使用某些版本控制系统(例如git)很有帮助)。因此,获得该版本不可能是“标准”的,即使它非常容易(它也可能取决于您的项目的约定和编码习惯,也许还取决于您的版本控制系统)。我想您可以在构建中生成一些_timestamp_version.cs生成的 C# 文件并对其进行适当编译,并_timestamp_version.cs定义一些要从您的Main. 在 C 中,make这是一个非常简单的技巧,您只需将其适应您的编程语言和构建过程(另请参阅this Makefile及其_timestamp.c有关与 相关的更详细的内容git);在Unix 哲学中,这样做是很常见的,我很惊讶你会问这个!

也许有一些 API 可以查询 C# 中的某些版本元数据(可能与反射有关),但这是一个非常不同的问题。您只需按照惯例编写代码来显示一些与版本相关的字符串--version......

请记住(即使在 Windows 上,当然在 POSIX 和 Linux 上)编译器实际上与IDE不同。IDE(即使在 Windows 上)只是一个能够运行外部程序(例如编译器、调试器、构建自动化工具...)的源代码编辑器。您可以(而且通常应该)在 IDE 之外的命令行上运行编译器。因此,您可以通过生成一些 C# 代码(例如生成定义一些与版本相关的字符串常量等的文件)来进行基本的元编程。了解Unix 哲学(恕我直言,甚至在 Microsoft 内部也以某种方式使用它)。

请记住.csproj,IIRC 文件不是C#规范(用英语编写的技术报告)的一部分。另请参阅