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)
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)
首先,我们假设您的 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# 代码;如何完成是一个不同的问题,并且取决于您使用的特定构建实用程序;与或make您ninja'只需添加一些特定规则,例如在您的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#规范(用英语编写的技术报告)的一部分。另请参阅此。
| 归档时间: |
|
| 查看次数: |
1962 次 |
| 最近记录: |