배쉬

2017-12-23 4 views
1
나는 .csproj 파일이처럼 보이는 ASP.Net 코어 프로젝트를 개발하고 있어요

을 통해 컴파일/출판 후에 .NET 응용 프로그램의 버전 정보를 가져옵니다 :이 응용 프로그램은 용으로 제작배쉬

<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을 실행하고 명령 프롬프트를 사용하여 동일한 버전을 얻을 수 있습니다.


하지만 리눅스 배포판에서 같은 것을 얻는 표준 방법이 있습니까? 이 answer 실험

  • how-to-find-version-of-a-file-or-program

  • :

    내가 들여다했습니다. 그것은 파일 시스템을위한 것이지만!

  • this post에서 언급 한대로 myapp --version/fullpath/myapp --version을 시도했습니다. 또한 표시된 중복으로 솔루션을 시도했습니다. bash는를 사용하여 버전 정보를 얻을 수 있도록

모든 시련 후에는 것, 나는 .csproj 파일에 다른 뭔가를 구현해야합니다. 어떤 사람이해야 할 일이 무엇인지 지적하거나 같은 것을 암시 할 수 있습니까?


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 
+0

사용하려고 했 [문자열 (1)] (http://man7.org/linux/man-pages/man1/strings.1.html)? 충분할 수도 있습니다. –

+0

@BasileStarynkevitch 링크 된 문서를 보면 이전에 시도한 것처럼'string'의'--version' 부분이 아닙니다. 다른 것을 지적했다면 명시 적으로 지적 할 수 있습니까? –

+0

'Main' 코드 (C#으로 코딩되어있는 경우)를 보여주고 빌드 과정을 설명함으로써 질문을 향상시켜야합니다. 더 많은 [compilation] (https://en.wikipedia.org/wiki/Compilation) 프로세스를 이해하고 질문에 답해야합니다. ** 개선을 위해 ** 귀하의 질문을 ** 수정하십시오. Linux에서 사용하는 컴파일러에 대해 더 자세히 설명하고 소스 코드에서 실행 파일을 작성하는 방법을 설명하십시오. 그 빌드에 어떤 명령을 사용합니까? –

답변

1

첫째,의는 리눅스 프로그램을 가정하자가 yourprogexecutable로 컴파일하고 구축하는 것을 그것의 소스 코드에서 (그래서 당신은 약간 소스 코드와 빌을 변경할 수 있습니다 딩 절차). 빌드 프로 시저가 무엇인지 또는 어떤 프로그래밍 언어로 코딩하는지는 중요하지 않습니다. 그 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# 코드를 생성 할 수 있습니다.이 질문은 다른 질문이며 사용하는 특정 빌드 유틸리티에 따라 다름) 또는 ninjaMakefile 또는 build.ninja과 같이 특정 규칙을 추가하기 만하면됩니다. 따라서 빌드 절차를 이해하고 개선해야합니다. C#을 코딩하는 경우 Main에서 처리해야하므로 Main을 개선하여 args을 구문 분석하고 적절하게 --help--version을 처리해야합니다 (Windows에서는 다른 것일 수 있음). BTW, IMHO 다른 OS에서도 버전을 쿼리하고 도움을 얻을 수있는 프로그램 인수를 전달할 수 있다면 도움이됩니다. Windows는 모르지만 및 --help 대신 /version/help 일 수 있습니다. software versioning항상 사람의 규칙이라고

공지 사항 (일부 version control 시스템, 예를 들어 git을 사용하는 것이 도움이 경우에도). 그래서 그 버전을 얻는 것이 "표준"이 될 수는 없지만 (프로젝트의 관습과 코딩 습관, 그리고 아마도 버전 관리 시스템에 달려있을 수도 있습니다). 나는 당신이 빌드에서 어떤 _timestamp_version.cs 생성 C# 파일을 생성하고 적절하게 컴파일하고 그 _timestamp_version.cs 당신의 Main에서 표시되는 몇 가지 상수 문자열을 정의 할 것 같아요. C에서 make이 실제로는 easy trick이고 프로그래밍 언어 및 빌드 절차에 맞게 조정하면됩니다 (git과 관련된보다 정교한 내용은 thisMakefile 및 해당 _timestamp.c 참조). Unix philosophy에서 그렇게하는 것이 매우 일반적이며, 나는 당신이 그것을 요구하는 것에 놀랐습니다!

어쩌면 리플렉션과 관련된 C#에서 일부 버전 메타 데이터를 쿼리하는 API가 있지만 이는 매우 다른 질문입니다. 종래의 코드는 (심지어 Windows에서, 그리고 확실하게 POSIX & 리눅스)

그 기억 .... --version와 일부 버전과 관련된 문자열을 표시합니다 compilers 실질적으로 IDE의 동일하지 않습니다 그리고 당신은 그냥한다. IDE (Windows 만 해당)는 외부 프로그램 (예 : 컴파일러, 디버거, 빌드 자동화 도구 ...)을 실행할 수있는 source code editor입니다. 명령 줄에서 IDE 외부에서 컴파일러를 실행할 수 있습니다. 따라서 일부 C# 코드 (예 : 버전과 관련된 몇 개의 문자열 상수를 정의하는 파일 생성 등)를 생성하여 기본 metaprogramming을 수행 할 수 있습니다. Unix philosophy (IMHO는 Microsoft 내부에서 사용되는 경우도 있습니다)에 대해 읽어보십시오.

.csproj 파일은 IIRC가 아니며 C# 사양 (영어로 작성된 기술 보고서)의 일부입니다. this을 참조하십시오.

+0

이 답변에서 많은 것을 지적하고자 노력해 주셔서 감사합니다. 언급 된 모든 측면을 살펴보고, 그렇다면 내 dotnet 핵심 응용 프로그램은'C# '을 사용하여 컴파일됩니다. 돌아와서 모든 것이 잘 풀리면 답을 받아 들일 것입니다. 크로스 플랫폼 응용 프로그램을 만들면서 Linux는 나를위한 새로운 영역입니다. 그래서 해결책을 찾을 때까지 나와 함께 곰 : –

+0

C# 응용 프로그램은 * 아닌 * 네이티브 응용 프로그램입니다. 여기에 언급 된 많은 아이디어 (ELF 객체 (PE 대신))는 적용 할 수 없습니다. 메타 프로그래밍의 비트는 버전이 csproj 파일 (이미'Make' /'ninja'의 역할을 맡고 있음)에 이미 정의되어 있기 때문에 훨씬 의미가 없습니다. – omajid

+0

IIRC, 모노로 일부 C# 코드를 컴파일 할 때 'csproj' 파일이 없습니다. 따라서 이러한 파일은 C# 정의의 일부가 아닙니다. –

1

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