dotnet-5.0에 대한 단일 파일 응용 프로그램

7544 단어 publishdotnetC#
개시하다
dotnet은 구조적으로 일반적으로 구축되면 다수의 조립을 동반하는 실행 파일이 된다.
이는 웹 애플리케이션으로 펼칠 경우 문제가 되지 않지만, 콘솔 애플리케이션으로 펼치려면 불편한 경우가 많다.
따라서dotnet은 단일 파일의 2진법으로 생성물을 정리하는 기능이 있지만, 나는dotnet-5.0이 어떻게 변하는지, 사용에 있어서 점이 되는 부분을 쓰고 싶다.
미리 지식: msbuild의 속성
글에서 msbuild의 속성을 언급했는데 몇 가지 설정 방법이 있기 때문에 간단하게 썼습니다.
msbuild 속성에 대한 몇 가지 규칙이 있습니다. 자세한 내용은 공식 문서를 보십시오. .
엔지니어링 속성
프로젝트 단위로 속성을 설정하는 경우 구축할 때 명령줄에서 지정한 방법과 프로파일 미리 넣는 방법이 있습니다.
명령줄을 지정한 경우 msbuild /p:[プロパティ名]=[プロパティの値]처럼 설정합니다.
dotnet publish 명령으로 구축할 때 "dotnet publish-p:[속성 이름]=[속성 값]"으로 지정합니다
proj 파일을 쓸 때 다음과 같습니다
app.csproj
<PropertyGroup>
  <プロパティ名>[プロパティ値]</プロパティ名>
</PropertyGroup>
같은 속성 이름을 여러 개 지정하면 마지막으로 읽은 이름을 사용합니다
항목 단위 속성
예를 들어 각 파일에 대해 속성을 설정할 때 다음과 같다.
app.csproj
<ItemGroup>
  <!-- 新しく指定する場合 -->
  <アイテム種別 Include="[globパターン]" プロパティ名1="プロパティ値1">
    <プロパティ名2>プロパティ値2</プロパティ名2>
  </アイテム種別>
  <!-- 既存のアイテムに追加したい場合 -->
  <アイテム種別 Update="[globパターン]" プロパティ名1="プロパティ値1>
    <プロパティ名2>プロパティ値2</プロパティ名2>
  </アイテム種別>
</ItemGroup>
PublishSingleFile
이 일에 관해서 먼저 열거할 수 있는 것은Publish Single File 로고죠.dotnet publish를 실행할 때 속성PublishSingleFile=true을 추가하면 부속된 부품 파일이 모든 실행 가능한 파일로 집합됩니다.
또한 로컬 바이너리를 포함해야 하기 때문에publish의 RuntimeIdentifier 속성 지정 (또는dotnetpublish 명령의 --runtime 옵션이 필요합니다.
사용자들은 별다른 변화가 없어 보이지만 실제dotnet core-3.1과dotnet 5의 내용은 다르다.
프레임 의존형과 자기완결형에 관하여
dotnet의publish는 두 가지 집합 방법이 있는데 구조 의존과 자기 완결이 있다.PublishSingleFile는 양측을 지원합니다.
전자는 2진법에 기초 라이브러리와 운행 시간을 포함하지 않기 때문에 사이즈를 줄일 수 있다.
후자는 운행 시간을 포함하여 시스템에서 운행 시간이 없어도 조작할 수 있으나 사이즈가 크게 증가했다.
구체적으로 헬로월드 등급에서는 전자는 최대 150kb 미만이었고, 후자는 아무것도 하지 않고 60MB 이상으로 성장했다.
또한, PublishSingleFile를 설정한 경우 기본적으로 자완결형이기 때문에 프레임 의존형으로 설정하고자 하는 경우dotnet publish--self-contained=false 옵션을 추가하거나 msbuild 속성에 지정SelfContained=false합니다.
또한, PublishSingleFile을 설정하지 않을 때는 기본값RuntimeIdentifier을 지정하지 않을 때는 프레임 종속형, 지정을 할 때는 자기완결형으로 지정하는 것도 주의해야 한다.
기본값의 관계를 요약하면 다음과 같다.

빼놓다
예를 들어 플러그인으로 사용되는 dll 같은 집합하고 싶지 않은 파일이 존재하면 개별 항목에 설정ExcludeFromSingleFile=true 속성을 통해 합병을 피할 수 있다.
csproj
<ItemGroup>
  <None Update="hoge.txt" ExcludeFromSingleFile="true"/>
</ItemGroup>
dotnet core-3.1 방식
이 방식의 경우, 조합 부품 그룹은 압축되어publish에서 실행할 수 있는 파일에 저장됩니다.
이 실행 가능한 파일을 실행할 때 다음과 같은 행위를 할 수 있다
  • 임시 폴더로 압축된 파일 그룹 확장
  • 이 기본 경로/[이름 적용]/[ID]로 확장됩니다. 기본 경로는 "DOTNET"입니다.BUNDLE_EXTRACT_BASE_DIR 환경 변수가 설정되어 있는 경우 이를 시작점으로 하지만 설정되지 않은 경우는 다음과 같습니다.
  • Windows: %TEMP%\.net
  • Linux, macOS: $TMPDIR/.net/$UID, /var/tmp/.net/$UID, /tmp/.net/$UID 중 어느 것
  • 압축된 파일 그룹에 포함된 소스로 실행 가능한 파일
  • 이후 일반적인 실행과 동일
  • 이 방식은 처음에 전개된 시간은 들었지만 기존의 구조에서 큰 변경을 하지 않고 응용할 수 있다.
    그러나 임시 폴더라고는 하지만 실행 시 파일을 확장하면 디스크가 압박되거나 입출력 부하가 남게 됩니다.
    또한dotnet5에서IncludeAllContentForSelfExtract=true를 msbuild의 속성에 추가함으로써selfextracted를self로 만들 수 있다.
    dotnet 5.0 방식 (삽입 방식)
    종속 구성 요소와 같은 첨부된 파일을 생성된 실행 파일에 저장하는 것은 3.1과 같지만 임시 폴더로 확장하지 않고 파일에서 구성 요소를 직접 읽고 실행할 수 있습니다.실상
    상세히 말하면dotnet 문서에 기재된 일반적인 기능에 비해 동작이 조금 다른 기능을 가지고 있다.
    포함 방법에 필요한 실행 시간 정보
    dotnet core-3.1(netcorreapp3.1)에서는 특별히 설정하지 않아도 단일 실행 가능한 파일만 생성하지만 네트워크5.0에서 다음 로컬 바이너리는 같은 폴더에 의존하는 바이너리로 존재해야 합니다.
  • coreclr.dll: 운행 시간 주체
  • clrjit.dll: JIT 컴파일러
  • clrcompression.dll: 압축/압축 풀기
  • 기본적으로 필요한 것은 상술한 바와 같이 디버깅용 2진법도 첨부할 수 있다.
    이 파일들을 합치려면 MSbuild의 구축 속성IncludeNativeLibrariesForSelfExtract=true(+5~10MB 정도)를 추가합니다.
    로고를 지정하면 로컬 라이브러리가 임시 디렉토리로 확장됩니다.
    https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file#other-considerations
    치수 삭감 정보
    특별히 설정을 추가하지 않고 퍼블리시싱 파일로 진행하면 헬로월드급 앱도 60MB 이상 된다.
    이 대부분은 실제 사용되지 않는 프로그램 라이브러리의 파일에 의해 차지된다.
    컴파일할 때 PublishTrimmed=true를 구축할 때의 속성에 추가하면 사용하지 않은 것으로 판단되는 DLL은 생성물에서 제외됩니다.
    이로써 헬로월드 등급이라면 20MB 미만으로 감축할 수 있다.더 크다고 하면 그렇지.
    다만, 반사 등을 여러 번 사용하는 라이브러리를 사용하는 경우 잘못된 판단이 발생해 제외될 가능성도 있어 생성물을 반드시 테스트하는 것을 추천한다.
    또 닷넷5.0부터'트림모드'속성에'링크'를 설정함으로써 기존 조립단위의 삭감 진입을 통해 현장과 방법 등 구성원 정보를 삭감하는 동작을 진행한다.
    실제로 이를 설정한 뒤 헬로월드급 앱을 퍼블리쉬한 결과 10MB가 넘었다.
    다만, 더 적극적으로 삭감하는 옵션인 만큼 이전부터 발생하지 않았던 고장이 발생할 수도 있으니 사용 시 주의해야 한다.
    기타 명확한 삭감을 피하고자 할 때의 설정 등은MS 공식 문서 참조
    Publish에 따라 API의 동작 변화
    API 일부가 단일 파일 방식으로 다음과 같은 영향을 받습니다.
    모드
    Assembly.Location
    AppContext.BaseDirectory
    PublishSingleFile을 실행하지 않음
    이 구성 요소 (dll 또는exe) 의 조립 경로
    실행 가능한 파일이 있는 폴더
    디스크 확장 방법
    폴더의 구성 요소 경로 확장
    압축된 폴더 풀기
    내장형
    항상 빈 문자열
    실행 가능한 파일이 있는 폴더
    특히 AssiemblyLocation이 하늘로 바뀝니다.
    기타 영향은 MS 공식 문서 참조이다.
    끝맺다
    한번 그려봤지만 실제 내부 구조 등을 살펴보니 재밌는 부분도 많았고, 관심이 있다면 가까운 이야기도 써봤으면 좋겠다.
    또 헬오월드에서는 10MB라는 숫자가 콘솔 애플리케이션으로서는 큰 편이고, 불만이 있는 사람이 네이티브 AOT(Ahead Of Time)로 컴파일하는 수법도 있어 관심 있는 사람이 알아볼 수 있다.
    참조 링크 요약
  • 5.0 issue(close)
  • 일반 문서
  • PublishSingleFile에 대한 공식 문서
  • PublithTrimmed 정보
  • dotnet의 NativeAOT 실험장(구 corret)
  • 좋은 웹페이지 즐겨찾기