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

yqlxgs2m  于 2023-10-16  发布在  Linux
关注(0)|答案(3)|浏览(115)

我正在开发一个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>

当此应用程序为 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();
}

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

dotnet publish -c release -r centos.7-x64
qhhrdooz

qhhrdooz1#

如果你只需要通过bash找到一个dll文件的版本,那么使用exiftool可能更容易。

$ 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

甚至只是:

$ exiftool -"ProductVersion" Foo.dll 
Product Version                 : 17.12.1
kcugc4gi

kcugc4gi2#

首先,假设您的Linux程序被编译为yourprogexecutable,并且您正在从它的源代码构建它(因此您可以稍微修改源代码和构建过程)。无论您的构建过程是什么,或者您使用什么编程语言编写代码。该yourprog文件可能是某个ELF可执行文件或其他文件(例如,脚本)可由execve(2)系统调用理解。使用file(1),例如作为file yourprog,找出它的file format。参见binfmt_miscabout #! (shebang)。请注意,* 每个 * 应用程序都是用一些execve启动的(通常是由Unix shell启动的,但也可能是由其他东西启动的,例如systemd)。
您可以使用strings ./yourprog在该可执行文件上使用strings(1);你就可以得到大部分的多字节字符串。可能一些(许多)字符串包含版本信息(如果它在编译阶段就被放在那里)。
关于--version,它应该是你的程序遵循的一个 * 约定 *。this答案所以你应该改进你的源代码,这样你的程序就可以处理--version--help程序参数了。这里没有魔法,你必须编写代码(也许你的build automation可以生成一些包含版本字符串的C#代码;如何实现则是另一个问题,这取决于您使用特定构建实用程序;对于makeninja,您只需添加一些特定的规则,例如:在您的Makefilebuild.ninja中)。因此,您需要了解并改进构建过程。如果您使用C#编写代码,则需要从Main处理它,因此您需要改进Main以解析args并适当处理--help--version(在Windows上,它可能是其他东西)。顺便说一句,即使在其他操作系统上,能够传递一些程序参数来查询版本并获得帮助也是很有帮助的(我不知道Windows,但也许它可能是/version/help,而不是--version--help)。
请注意,software versioning * 始终 * 是一种人类约定(即使使用某些version control系统,例如git,很有用)。因此,获取该版本不能是“标准的”,即使它非常容易(它也可能取决于您的项目的约定和编码习惯,以及您的版本控制系统)。我猜你可以在你的构建中生成一些_timestamp_version.cs生成的C#文件,并适当地编译它,让_timestamp_version.cs定义一些常量字符串,以从Main中显示出来。在C中,make是一个真正的easy trick,你只需要让它适应你的编程语言和构建过程(参见thisMakefile及其_timestamp.c,了解与git相关的更详细的内容);在Unix philosophy中,这样做很常见,我很惊讶你会问这个问题!
也许有一些API可以查询C#中的版本元数据(可能与反射有关),但这是一个非常不同的问题。你只需要按照惯例编写代码,用--version显示一些与版本相关的字符串。
请记住(即使在Windows上,当然也在POSIX和Linux上)compilers实际上与IDE不一样。IDE -即使在Windows上-也只是一个能够运行外部程序的source code editor。编译器、调试器、构建自动化工具.)。您可以(通常也应该)在IDE外部的命令行上运行编译器。因此,您可以通过生成一些C#代码(例如,生成定义与版本等相关的几个字符串常量的文件)。阅读有关Unix philosophy(IMHO甚至在微软内部使用)的信息。
请记住,.csproj文件不是IIRC C#规范(用英语编写的技术报告)的一部分。this

ac1kyiln

ac1kyiln3#

查看应该与. exe一起生成的dummyapp.deps.json。从这个文件中,你应该能够找到你的应用程序的版本。
参见(可能有些过时)deps.json-files的文档:runtime-configuration-file

相关问题