dotnet-5.0에 대한 단일 파일 응용 프로그램
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에서 실행할 수 있는 파일에 저장됩니다.
이 실행 가능한 파일을 실행할 때 다음과 같은 행위를 할 수 있다
%TEMP%\.net
$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에서 다음 로컬 바이너리는 같은 폴더에 의존하는 바이너리로 존재해야 합니다.
이 파일들을 합치려면 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)로 컴파일하는 수법도 있어 관심 있는 사람이 알아볼 수 있다.
참조 링크 요약
Reference
이 문제에 관하여(dotnet-5.0에 대한 단일 파일 응용 프로그램), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/skitoy4321/items/e8a43881456edc1f2c61텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)