1. 程式人生 > >【譯】.NET Core 3.0 釋出小尺寸 self-contained 單體可執行程式

【譯】.NET Core 3.0 釋出小尺寸 self-contained 單體可執行程式

.NET Core 提供的釋出應用程式選項 self-contained 是共享應用程式的好方法,因為應用程式的釋出目錄包含所有元件、執行時和框架。您只需要告訴使用者應用程式的入口 exe 檔案,就可以使程式執行起來,而不必擔心目標計算機上是否存在.NET Core 執行時和應用框架。目前 .NET Core 3.0 Preview 6 已經推出,也包含了更多新功能。其中一個有用的功能就是引入了 PublishTrimmed 釋出標誌。此標誌可以很大程式上減少可執行檔案的大小並會建立一個修剪過的自包含單體可執行檔案。下面我們來看一下如何釋出一個經過修剪的單體可執行檔案。

.NET Core 3.0 中釋出 self-contained 程式可以使用下面的命令:

dotnet publish -r win-x64 -c Release --self-contained

 上面的命令執行之後會在建立的釋出資料夾中包含 self-contained 可執行程式所需的所有檔案,檔案數大概有 100 個左右,如果想要在目標計算機上執行這個應用程式,那就需要複製這個釋出資料夾內所有檔案,似乎並不是那麼方便,而且這些檔案佔用的空間也不算小。

這個問題在 .NET Core 3.0 Preview 5 中得到了解決。此版本引入了一個 PublishSingleFile 釋出標誌,用於生成一個單體 exe 可執行檔案。該釋出標誌的使用方法如下:

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

或者在專案檔案中配置如下節點:

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>netcoreapp3.0</TargetFramework>
  <RootNamespace>Hello_.NETCore3</RootNamespace>
  <PublishSingleFile>true</PublishSingleFile>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

使用此釋出標誌後只會生成一個 exe 可執行檔案和符號檔案。見下圖

現在只有一個可執行檔案了,但其檔案大小有點兒小問題,一個可執行程式接近 70MB 。上面說過,在 .NET Core 3.0 Preview 6 中引入了 PublishTrimmed 釋出標誌,使用該釋出選項將不會包含您未使用的類庫,以達到減小發布單體檔案的尺寸。您可以將上面的兩個命令一起使用,如下:

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true

或在專案檔案中配置以上兩個釋出標誌:

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>netcoreapp3.0</TargetFramework>
  <RootNamespace>Hello_.NETCore3</RootNamespace>
  <PublishSingleFile>true</PublishSingleFile>
  <PublishTrimmed>true</PublishTrimmed>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

使用上面的兩個命令後,您會發現,單體可執行檔案的尺寸只有 29MB 了。對於簡單的控制檯應用程式來說,它仍然有點兒大,但請注意,這是一個包含了 .NET Core 執行時的 self-contained 應用程式。

以上就是我要介紹的全部內容了。

原文連結:https://www.talkingdotnet.com/create-trimmed-self-contained-executable-in-net-core-3-0/

譯者注: 

參考連結:

  • https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0-preview-6/
  • https://github.com/mono/linker/blob/master/src/ILLink.Tasks/README.md