.NET Core 3.0 构建和部署

Default Executables 默认可执行文件 

 dotnet build  dotnet publish 期间,将创建一个与你使用的 SDK 的环境和平台相匹配的可执行文件。 和其他本机可执行文件一样,可以使用这些可执行文件执行相同操作,例如:  

  • 可以双击可执行文件。  

  • 可以直接从命令提示符启用应用程序,如 Windows 上的 myapp.exe,以及 Linux  macOS 上的 ./myapp 

 

下面是一个基于.NET Core 2.2的项目: 

Solution 'CgzI.Api' (3 of 3 projects) 
CgzLApi 
Connected Services 
Dependencies 
Properties 
Auth 
Cache 
Controllers 
HealthChecks 
Helpers 
nteffaces 
logs 
Services 
ViewModeIs 
appsettingsjson 
Program.cs 
StartupDeveIopment.cs 
StartupProduction.cs

 

当我Build该项目之后,在bin/Debug/netcoreapp2.2目录下有这些文件: 

s PC Important (D:) Projects 
P rope ties 
publish 
appsettings.DeveIopmentjson 
appsettings.json 
appsettings.Production.json 
CgzI.Api.depsjson 
CgzI.Api.dII 
CgzI.Api.pdb 
CgzI.Api.runtimeconfig.devjson 
CgzI.Api.runtimeconfigjson 
CgzI.Core.dII 
CgzI.Core.pdb 
Cgzl.lnfrastructure.dll 
Cgzl.lnfrastructure.pdb 
dot net 
Cgzl CgzI.Api 
Date modified 
10/27/2019 7:10 PM 
2/7/2019 1012 AM 
6/15/2019357 PM 
2/3/2019 11:13 AM 
2/23/2019 11:33 AM 
10/27/2019 7:10 PM 
10/27/2019 7:10 PM 
10/27/2019 7:10 PM 
10/27/2019 7:10 PM 
10/27/2019 7:10 PM 
10/27/2019 7:10 PM 
10/27/2019 7:10 PM 
10/27/2019 7:10 PM 
10/27/2019 7:10 PM 
CgzI.Api bin Debug 
Type 
File folder 
File folder 
JSON source File 
JSON Source File 
JSON source File 
JSON source File 
Application exten... 
Program Debug D... 
JSON source File 
JSON source File 
Application exten... 
Program Debug D... 
Application exten... 
Program Debug D... 
netcorea pp22 
Size 
255 KB 
88 
21 KB 
25 KB 
81 KB 
15 KB

这里没有.exe文件。 

 

下面是一个.NET Core 3.0的项目: 

Solution 'Recruit' (3 of 3 projects) 
Recruit.Api 
Connected Services 
Dependencies 
Properties 
Controllers 
Helpers 
Services 
ViewModeIs 
appsettings.json 
a Program.cs 
Recruit.db 
a Startup.cs

 

当我build项目后,bin/Debug/netcoreapp3.0目录下有这些文件: 

s PC 
Important (D:) 
P rope ties 
runtimes 
Projects 
dotnet 
Recruit Recruit.Api 
Date modified 
10/27/2019 7:12 PM 
9/21/2019 11:35 AM 
9/21/2019 11:27 AM 
9/21/2019 11:27 AM 
9/21/2019 1:54 PM 
7/11/2019&38 PM 
8/12/2019 1242 PM 
8/12/2019 1:19 PM 
3/4/2019 402 AM 
3/4/2019 407 AM 
9/7/2019 1•41 AM 
7:51 PM 
9/7/2019 1•41 AM 
9/7/2019 AM 
9/7/2019 AM 
9/7/2019 AM 
9/7/2019 AM 
7:51 PM 
10/24/2018 648 PM 
11/27/2018 11:10 PM 
11/27/2018607 PM 
10/27/2019 7:12 PM 
10/27/2019 7:12 PM 
10/27/2019 7:12 PM 
10/27/2019 7:12 PM 
10/27/2019 7:12 PM 
10/27/2019 7:12 PM 
10/27/2019 7:12 PM 
10/27/2019 7:12 PM 
bin Debug 
Type 
File folder 
File folder 
netcoreap p3.O 
appsettings.DeveIopmentjson 
appsettings.json 
appsettings.Productionjson 
ArdaIis.GuardCIauses.dII 
AutoMapper.dII 
AutoMapper.Extensions.Microsoft.Depen... 
Microsoft.AspNetCoreJsonPatch.dII 
Microsoft.AspNetCore.Mvc.NewtonsoftJ... 
Microsoft.Data.SqIite.dII 
Microsoft.DotNet.PIatformAbstractions.dII 
Microsoft.EntityFramevMkCore.Abstract... 
Microsoft.EntityFrameworkCore.Design.dII 
Microsoft.EntityFrameworkCore.dII 
Microsoft.EntityFramewn•rkCore.ReIation... 
Microsoft.EntityFrameworkCoreSqIite.dII 
Microsoft.Extensions.DependencyModeI.... 
Microsoft.OpenApi.dII 
Newtonsoft.Json.8son.dII 
Newtonsoft.Json.dII 
Recruit.Api.depsjson 
RecruitApi.dII 
Recruit.Api.exe 
Recruit.Api.pdb 
Recruit.Api.runtimeconfig.devjson 
Recruit.Api.runtimeconfigjson 
Recruit.Core.dII 
Recruit.Core.pdb 
JSON source File 
JSON source File 
JSON source File 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
Application exten... 
JSON source File 
Application exten... 
Application 
Program Debug D... 
JSON source File 
JSON source File 
Application exten... 
Program Debug 
Size 
282 KB 
12 KB 
52 
144 KB 
24 KB 
21 KB 
238 KB 
1,488 KB 
784 KB 
125 KB 
67 KB 
161 KB 
96 
654 KB 
216 KB 
36 
1 56 KB 
10 KB 
17 KB

值得注意的就是,这里有一个exe文件,点击它可以直接运行该项目。 

而且这个exe文件的大小也很小,这是因为它依赖于.NET Core运行时,它所需要的依赖项在我电脑上是全局可用的。 

还有另外一个地方也值得注意,项目所有的依赖也都复制到了这个输出的文件夹里。 

 

Single-file Executables 单文件可执行文件 

这种部署方式很方便,、。dotnet publish命令支持将应用打包为特定于平台的单文件可执行文件。该可执行文件是自解压缩文件,包含运行应用所需的所有依赖项(包括本机依赖项)。首次运行应用时,应用程序将根据应用名称和生成标识符自解压缩到一个目录中。再次运行应用程序时,启动速度将变快。除非使用了新版本,否则应用程序无需再次进行自解压缩。 

 

下面针对这个.NET Core 3.0的项目,我们修改一下项目属性,来实现Single-file Executables部署: 

<PropertyGroup> 
<TargetFramework>netcoreap . q/ Tar 
Framework> 
meldentifier> 
PublishSingleFile> 
PropertyGroup>

 

build的话不会起作用,这个功能仅支持发布(publish): 

Ove Niew 
Connected Services 
Service References 
Publish 
Deploy your app to a folder, IIS, Azure, or another destination. More info 
FolderProfile 
New Edit Rename Delete 
Summary 
Target Location 
Delete Existing Files 
Configuration 
Publish 
False 
Release

 

看一下输出文件夹: 

Type 
BON So 
appsettings.DeveIopmentjson 
appsettings.json 
appsettings.Prod 
Recruit.Api.exe 
RecruitApi.pdb 
web.config 
Date modified 
9/21/2019 11:27 AM 
9/21/2019 11:27 AM 
9/21/2019 1:54 PM 
10/27/2019 7:25 PM 
10/27/2019 7:25 PM 
10/27/2019 7:25 PM 
File 
JSON source Fi 
JSON source File 
Application 
Program Debug D... 
Configuration Sou... 
Size 
94,260 KB

实际上这里只有一个exe文件,没有其它dll文件,而且这个exe文件很大,因为这里面包含了它需要的所有依赖。 

 

Assembly linking 程序集链接

目前这个exe有点大,.NET core 3.0 SDK 随附了一种工具,可以通过分析 IL 并剪裁未使用的程序集来减小应用的大小。 

自包含应用包括运行代码所需的所有内容,而无需在主计算机上安装 .NET 但是,很多时候应用只需要一小部分框架即可运行,并且可以删除其他未使用的库。 

 .NET Core 现在包含一个设置,将使用 IL 链接器工具扫描应用的 IL 此工具将检测哪些代码是必需的,然后剪裁未使用的库。 此工具可以显著减少某些应用的部署大小。 

 

要启用此工具,请使用项目中的 <PublishTrimmed> 设置并发布自包含应用: 

<PropertyGroup> 
<TargetFramework>netcoreapp3. getFramework> 
<RuntimeIdentifier>win1Ø-x 4 
ntimeldentifier> 
hSingleFile> 
PublishTrimmed> 
PropertyGroup>

 

再次发布后: 

ortant (D:) 
Projects 
dot net 
Recruit 
Recruit.Api bin 
Date modified 
9/21/2019 11:27 AM 
9/21/2019 11:27 AM 
9/21/2019 1:54 PM 
10/27/2019 853 PM 
10/27/2019 PM 
10/27/2019 853 PM 
Release netcoreapp3.O 
Type 
Source File 
JSON sou 
JSON source F 
Application 
Program Debug D... 
Configuration Sou... 
publish 
Size 
appsettings.DeveIopmentjson 
appsettingsjson 
appsettings.Production.json 
Recruit.Api.exe 
RecruitApi.pdb 
web.config

可以看到exe文件的大小减小了很多,这是因为这里只包含了这个项目真正用到的依赖。 

 

但是启用这个特性的时候一定要注意,如果项目使用到了反射或相关动态功能(例如 ASP.NET Core  WPF,那么通常会在剪裁时损坏。 发生此损坏是因为链接器不知道此动态行为,并且不能确定反射需要哪些框架类型。 可配置 IL 链接器工具以发现这种情况。  

最重要的是,剪裁后务必对应用进行测试。 

 

ReadyToRun 镜像 

可以通过将应用程序集编译为 ReadyToRun (R2R) 格式来改进.NET Core 应用程序的启动时间。 

R2R 是一种预先 (AOT) 编译形式。 R2R 二进制文件通过减少应用程序加载时实时 (JIT) 编译器需要执行的工作量来改进启动性能。 二进制文件包含与 JIT 将生成的内容类似的本机代码。 但是,R2R 二进制文件更大,因为它们包含中间语言 (IL) 代码(某些情况下仍需要此代码)和相同代码的本机版本。 仅当发布面向特定运行时环境 (RID)(如 Linux x64  Windows x64)的自包含应用时 R2R 才可用。 

 

这里首先把注释掉<PublishTrimmed>,然后添加<PublishReadyToRun> 

<PropertyGroup> 
<TargetFramework>netcoreapp3. Øq/TargetFra 
ork> 
ntifier> 
Publ ishSi 
ile> 
PublishTrimmed> -> 
PublishReadyToRun> 
PropertyGroup>

 

发布: 

portant (D:) Projects 
dot net 
Recruit 
appsettings.DeveIopmentjson 
appsettings.json 
appsettings.Production.json 
Recruit.Api.exe 
RecruitApi.pdb 
web.config 
Recruit.Api bin 
Date modified 
9/21/2019 11:27 AM 
9/21/2019 11:27 AM 
9/21/2019 1:54 PM 
10/27/2019 PM 
10/27/2019 PM 
10/27/2019 PM 
Release netcoreapp3.O 
Type 
JSON source Fi 
JSON source File 
JSON source File 
Application 
Program Debug D... 
Configuration Sou... 
publish 
Size 
101,065 KB

发布后会得到一个稍微大一点的exe文件,这是因为里面包含了原生代码和IL(中间语言)版的程序。 

.NET Core 3.0 构建和部署

全文结束