我正在开发一个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发行版中有没有一个标准的方法来获得同样的效果呢?
我调查过:
- how-to-find-version-of-a-file-or-program
- 用这个answer做实验。虽然它是文件系统!
- 尝试
myapp --version
和/fullpath/myapp --version
,如this post中所述。也尝试了解决方案与标记的重复。
在所有的试验之后,似乎我需要在.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
3条答案
按热度按时间qhhrdooz1#
如果你只需要通过bash找到一个dll文件的版本,那么使用
exiftool
可能更容易。甚至只是:
kcugc4gi2#
首先,假设您的Linux程序被编译为
yourprog
executable,并且您正在从它的源代码构建它(因此您可以稍微修改源代码和构建过程)。无论您的构建过程是什么,或者您使用什么编程语言编写代码。该yourprog
文件可能是某个ELF可执行文件或其他文件(例如,脚本)可由execve(2)系统调用理解。使用file(1),例如作为file yourprog
,找出它的file format。参见binfmt_misc和about#!
(shebang)。请注意,* 每个 * 应用程序都是用一些execve
启动的(通常是由Unix shell启动的,但也可能是由其他东西启动的,例如systemd)。您可以使用
strings ./yourprog
在该可执行文件上使用strings(1);你就可以得到大部分的多字节字符串。可能一些(许多)字符串包含版本信息(如果它在编译阶段就被放在那里)。关于
--version
,它应该是你的程序遵循的一个 * 约定 *。this答案所以你应该改进你的源代码,这样你的程序就可以处理--version
和--help
程序参数了。这里没有魔法,你必须编写代码(也许你的build automation可以生成一些包含版本字符串的C#代码;如何实现则是另一个问题,这取决于您使用特定构建实用程序;对于make
或ninja
,您只需添加一些特定的规则,例如:在您的Makefile
或build.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。ac1kyiln3#
查看应该与. exe一起生成的
dummyapp.deps.json
。从这个文件中,你应该能够找到你的应用程序的版本。参见(可能有些过时)deps.json-files的文档:runtime-configuration-file