.net core 3.x 发布单文件
.翻译自:https://github.com/dotnet/designs/blob/master/accepted/2020/single-file/staging.md
NET Core 3.0 中单文件应用程序的设计。
介绍
在 .NET Core 3.0 中实现阶段 1(在暂存文档中所述)对单文件应用的支持。
构建系统接口
可以通过将以下属性添加到应用程序的项目文件来触发发布到单个文件:
<PropertyGroup>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
- 该属性同时应用于框架依赖和自包含的发布操作。
PublishSingleFile - 该属性适用于特定于平台的生成,与给定的运行时标识符有关。生成的输出是指定平台的本机二进制文件。设置为 时,将保留未定义或设置为 是一个错误。
PublishSingleFilePublishSingleFiletrueRuntimeIdentifierUseAppHostfalse - 设置该属性会导致托管应用、托管依赖项、特定于平台的本机依赖项、配置等(基本上在运行时未设置属性的情况下运行发布目录的内容)嵌入到本机 中。
PublishSingleFiledotnet publishapphost
默认情况下,符号文件不会嵌入到单文件中,而是作为单独的文件保留在发布目录中。这包括 IL 文件和即用式编译器生成的本机/文件。设置以下属性会导致符号文件包含在单文件中。.pdb.ni.pdbapp.guid.map
<PropertyGroup>
<IncludeSymbolsInSingleFile>true</IncludeSymbolsInSingleFile>
</PropertyGroup>
通过设置以下元数据,可以显式排除某些文件嵌入到单文件中:
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
例如,要将某些文件放在发布目录中,但不将它们捆绑到单文件中:
<ItemGroup>
<Content Update="*.xml">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
</Content>
</ItemGroup>
捆绑器
捆绑包人是一个工具,将托管应用及其依赖项嵌入到本机可执行文件中,如下所述。下面将介绍 .NET Core 3.x 中的捆绑布局。AppHost
| 捆绑布局(第 1.0 版) |
|---|
AppHost(Bundle-Marker) |
嵌入式文件app.dllapp.deps.jsonapp.runtimeconfig.jsondependency.dll... |
| 捆绑标题 (版本 #) 1.0#Number of Embedded FilesBundle-ID |
| 每个捆绑文件的捆绑清单 :( 此信息在 3.0 中不使用) Location (Offset, Size)Type :IL, ReadyToRun, other |
主机
启动时,AppHost 会检查其是否具有嵌入文件。如果是这样,它
- 内存映射整个捆绑包文件。
- 检查内容是否已提取到提取位置(如下所述)
- 如果提取位置中的所有文件都完好无损,则执行将继续重用提取的文件。
- 如果没有,则提取缺少的组件
- 如果提取不可用,主机将嵌入的文件提取到磁盘,如本文档中所述。
- 调用运行时(通过其他主机组件)。
提取位置
对于单文件应用,提取目录为<base>/<app>/<bundle-id>
<base>是DOTNET_BUNDLE_EXTRACT_BASE_DIR环境变量(如果已设置)。- 如果没有,则默认为:
- 窗户:
%TEMP%\.net - Unix:
${TMPDIR}/.net/${UID}如果已设置;如果已设置否则${TMPDIR}/var/tmp/.net/${UID}如果存在,并且是可写;否则/var/tmp/tmp/.net/${UID}如果存在,并且是可写;否则失败。/tmp
- 窗户:
<app>是单 exe 二进制的名称<bundle-id>是唯一的捆绑标识符。
API 影响
大多数应用开发对于应用是否以单文件形式发布是不可知的。但是,处理文件物理位置的应用部分需要了解单文件打包。
Assembly.Location:返回提取位置内的实际位置。AppContext.BaseDirectory:返回提取目录,其中驻留的位置。app.dll
用户体验
总之,以下是创建 HelloWorld 单文件应用的总体体验
- 创建新的 HelloWorld 应用:
HelloWorld$ dotnet new console
框架依赖HelloWorld
正常发布:
dotnet publish- 发布目录包含主机、应用程序、配置文件 和 PDB 文件。
HelloWorld.exeHelloWorld.dllHelloWorld.deps.jsonHelloWorld.runtimeconfig.jsonHelloWorld.pdb
- 发布目录包含主机、应用程序、配置文件 和 PDB 文件。
单文件发布:
dotnet publish -r win10-x64 --self-contained=false /p:PublishSingleFile=true发布目录包含:
HelloWorld.exeHelloWorld.pdbHelloWorld.dll中嵌入 和 , 并嵌入 到 中。HelloWorld.deps.jsonHelloWorld.runtimeconfig.jsonHelloWorld.exe
运行:
HelloWorld.exe- 该应用程序完全从单一文件运行,无需中间提取即可归档。
独立世界
正常发布:
dotnet publish -r win10-x64- 发布目录包含 221 个文件,包括主机、应用程序、配置文件、PDB 文件和运行时。
单文件发布:
dotnet publish -r win10-x64 /p:PublishSingleFile=true- 发布目录包含:
HelloWorld.exeHelloWorld.pdb - 其余 219 个文件嵌入在主机中。
HelloWorld.exe
- 发布目录包含:
运行:
HelloWorld.exe- 首次运行时,219 个嵌入式文件将在启动时提取到磁盘。
- 应用的后续运行将重用提取,而不会产生启动开销。
调试
在应用的调试和分析方面,预计没有差异。
.net core 3.x 发布单文件的更多相关文章
- .NET Core 3.0 发布单文件可执行程序
Windows dotnet publish -r win10-x64 /p:PublishSingleFile=true maxOS dotnet publish -r osx-x64 /p:Pub ...
- VS2019(NET Core 3.0)发布单文件可执行程序
NET Core 3.0 发布单文件可执行程序 两种方法. 一.右击vs编辑项目文件,增加PublishSingleFile节点配置,代码如下: <Project Sdk="Micro ...
- .NET Core 3.0 Preview 5 亮点之一:发布单文件可执行程序
在阅读 Announcing .NET Core 3.0 Preview 5 时发现了 .NET Core 3.0 Preview 5 的一个新特性 —— Publishing Single EXEs ...
- .NET Core 新特性:发布单文件可执行程序
一.前言 .NET Core 3.0中新增加了一个特性:Publishing Single EXEs,可以通过dotnet publish 命令将整个.net core应用发布为一个可执行文件. 二. ...
- VS2017开发.net core 时默认发布路径文件夹多个BPC
新安装的VS2017,编译后进行发布,结果在bin文件夹下多了个BPC文件夹,很是费解,查了资料才知道是VS2017默认设置了环境变量.在此记录下,如果不需要默认路径可修改环境变量,具体操作如下: 我 ...
- VS2019 发布单文件
在项目.csproj文件下添加 <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework&g ...
- DotnetCore 单文件发布
NETCORE3.0开始,可以发布单文件,参考https://www.cnblogs.com/ZaraNet/p/11790645.html 发布后(config目录 是手工复制进去的) 运行时, ...
- ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件
虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件.CSS样式文件和图片文件 ...
- 译 .NET Core 3.0 发布
原文:<Announcing .NET Core 3.0> 宣布.NET Core 3.0 发布 很高兴宣布.NET Core 3.0的发布.它包括许多改进,包括添加Windows窗体和W ...
- Web的形式发布静态文件
Web的形式发布静态文件 虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件 ...
随机推荐
- AI Undetect是什么?
标题:AI UNDETECT:超越AI检测的反检测神器 在数字时代,人工智能的飞速发展已经渗透到我们生活的各个领域,包括教育.科技.网络内容制作等.越来越多的人依赖AI来生成各种内容,从学术作业.论文 ...
- MySQL查询BLOB类型的字段
1.MySQL有四种BLOB类型: 1.TinyBlob 最大能容纳255B的数据 2.Blob 最大能容纳65KB的 3.MediumBlob 最大能容纳16MB的数据 4.LongBlob 最大能 ...
- .NET云原生应用实践(五):使用Blazor WebAssembly实现前端页面
本章目标 使用Blazor WebAssembly实现管理"贴纸"页面 集成认证与授权机制 如果你对Blazor WebAssembly的使用不感兴趣,可以跳过本章的阅读.你也可以 ...
- 现代IT基础设施管理(1):Terraform初识和小试牛刀
基础设施包括各种云,像国内的阿里云.腾讯云和华为云,国外的AWS.微软Azure云和谷歌云,还有Kubernetes和OpenStack,都可以用Terraform进行资源管理.使用基础设施即代码(I ...
- 网站免费https加密教程
为网站实现HTTPS加密可以大大提高网站的安全性和用户信任度.以下是一个详细的免费HTTPS加密教程: 一.选择免费SSL证书提供商 JoySSL:这是目前国内为数不多的国产CA服务商打造的自主品牌S ...
- 2024-2025, 四大翻译工具加AI翻译的深度对比
前言 在过去两年中,人工智能技术的迅猛发展对翻译工具产生了深远的影响. 本期特意挑选了四款翻译工具以及一个AI翻译工具, 对其性能进行评测,看看在AI技术的加持下,它们的质量提升如何. 以下是参赛选手 ...
- Flink CDC 实时同步 MySQL
Flink CDC 系列文章 Flink CDC 实时同步 MySQL Flink CDC 实时同步 Oracle 准备工作 MySQL 数据库(version: 5.7.25),注意,MySQL 数 ...
- 【一步步开发AI运动小程序】十七、如何识别用户上传视频中的人体、运动、动作、姿态?
[云智AI运动识别小程序插件],可以为您的小程序,赋于人体检测识别.运动检测识别.姿态识别检测AI能力.本地原生识别引擎,内置10余个运动,无需依赖任何后台或第三方服务,有着识别速度快.体验佳.扩展性 ...
- Java 编程的动态性,第 1 部分: 类和类装入
研究类以及 JVM 装入类时所发生的情况 这一有关 Java 编程动态方面的新的系列文章研究了执行 Java 应用程序时幕后所发生的事情.企业 Java专家 Dennis Sosnoski 提供了 J ...
- Ubuntu桌面远程登陆配置
(1) 查看Ubuntu版本号 lsb_release -a (2) (a) 安装vim和Openssh-server sudo apt-get update sudo apt-get install ...