.Net Core程序的部署(FDD与SCD)
最近打算做一个公司的代码走查工具,思前想后觉得正好可以当作一个Core的实践机会,于是上官网看了下资料,顺便作了一下笔记方便以后查阅。
注1:这里的Core程序部署指的是.Net Core而非Asp.Net Core。
注2:本人已跟随官方文档更新。
一,.Net Core的部署形式
Core的应用程序部署有两种形式:
1,Framework-dependent deployment([Core Framework]依赖式部署)(FDD)
2,Self-contained deployment(独立式部署)(SCD)
从名字就看得出来他们的区别,第一种(FDD)是需要部署环境下已经安装.Net Core,而第二种(SCD)在发布时就包含了对应平台的框架。
二,Framework-dependent deployment([Core Framework]依赖式部署)
来看看如何以FDD的方式部署一个Core程序。
首先建立一个新的Core程序
(此处不会详细说明,如果不会的可以参考 此处 )
Program.cs如下,很简单的HelloWorld。
using System;
using static System.Console; namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
WriteLine("HelloWorld");
}
}
}
在程序所在目录下执行:
dotnet restore
dotnet build(或者dotnet run)
测试通过后输入
dotnet publish -f netcoreapp1.0 -c release
dotnet publish -f netcoreapp1.1 -c release (1.1版本)
来进行发布。
发布之后进入到你的程序目录的 bin/release/netcoreapp1.0(1.1)/publish 下,你会发现多了一些dll,他们会自动取project.json(*.csproj)所在的路径名。
运行命令
dotnet dotnetcore-getstarted.dll(这里要换成你的项目文件夹名)。
可以看到我们的HellorWorld程序已经跑起来了。
三,Self-contained deployment(独立式部署)(SCD)
(Core1.0版本,1.1版本在之后)
程序还是上面的HelloWorld,我们打开 project.json 修改一下配置,添加上 runtimes 节点,并且移除framework下的type节点。
改造之后的文件看上去是这样的。
关于runtime节点:此处填写的"win7-x64"是RIDs( Runtime IDentifiers ),你可以在引用页下面找到自己对应的RID。
然后运行
dotnet build(或者dotnet run)
需要注意的是,build是可以指定编译环境的如:
dotnet build -r win10-x64
如果你不指定,会从project.json中读取目标平台的参数。
编译完成后,它会在你的程序目录下生成如下路径 /bin/debug/netcoreapp1.0/<runtime_identifier> ,生成调试文件。
测试成功后,使用下面的命令发布:
dotnet publish -c release
你也可以指定目标平台,如果没有指定那么它会去project.json里读取。
现在进入到程序目录的 /bin/release/netcoreapp1.0/win7-x64/publish 下查看,你会发现产生的文件了除了exe之外还有一大堆core framework的模块dll。
如下:
在该路径下运行下你的exe:
成功输出了HelloWorld。
(Core1.1版本)
打开*.csproj文件,在 <PropertyGroup>
节点下追加 <RuntimeIdentifiers> 节点如下
使用以下命令来恢复相应的依赖
dotnet restore
然后可以使用发布命令来发布对应平台的发布包
dotnet publish -c Release -r win7-x64
dotnet publish -c Release -r osx.10.11-x64
它会在 .\bin\Release\netcoreapp1.1\<runtime_identifier> 路径下生成相应的程序和所需的Core环境。
四,对比
文件体积
很明显,由于SCD自带了core所以大小查了很多,在FDD下的程序只有8K,而后者有45MB。
对Core依赖性
FDD下的程序需要目标平台已经安装了core,而SCD不需要。
对目标环境的控制
由于SCD自带了Core所以能很好地控制宿主环境,防止由于目标平台的Core差异导致的一些意外。
对第三方引用库的支持
两者都能很好地支持,但都存在一个需要注意的地方,第三方库的目标平台需要与当前程序的一致。
五,总结
官方的推荐是使用FDD,这样的方式能使程序更小更简洁,也是可移植的(portable ),在多数情况下,FDD是优先选择。
SCD适用于一些网络相对封闭的场景比如医院或者企业内部网络,这时候自带Core进行产品发布是一个不错的选项。
不过其实在Docker盛行的这个年代,SCD让我觉得有些鸡肋。
题外话:早就觉得project.json文件跟以往的风格太不相称了,终于在Core1.1里又换回了熟悉的.csproj,顺带干掉了.xproj,真是大快人心。
有兴趣的同学可以点击 这里 参考原文。
.Net Core程序的部署(FDD与SCD)的更多相关文章
- 来个干货——使用VS2019发布.NET Core程序并部署到IIS的最新教程
使用VS2019发布.NET Core程序并部署到IIS,不管你是使用.NET Core开发的是Web API还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.NET Core ...
- 关于.net core程序的部署
最近发布.net core程序的时候,发现它是可以独立部署的,它支持如下两种部署方式: 依赖框架的部署FDD.只发布我们的程序,运行前用户需要手动安装.net core runtime. 独立部署SC ...
- 把Asp.net Core程序代码部署到Ubuntu(不含数据库)
今天记录一下第一次把.net core 程序发布到linux系统.linux用的是ubuntu Server 18.04版本.运行的IDE是vs 2019,发布出来是.net core 2.2版本. ...
- 使用VS 2019发布.net core程序并部署到IIS的最新教程
不管你是使用.net core开发的是web api还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.net core程序部署到IIS的朋友,可以看看这篇手把手教你部署.net ...
- 如何优雅的利用Windows服务来部署ASP.NET Core程序
上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足 ...
- Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署
运行环境 照例,先亮环境:软件的话我这里假设你已经批准好了.net core 运行环境,未配置可以看我的这篇[linux(centos)搭建.net core 运行环境] 腾讯云 centos:7.2 ...
- Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署
运行环境 照例,先亮底 centos:7.2 cpu:1核 2G内存 1M带宽 辅助工具:xshell xftp 搭建.net core运行环境 .net core 的运行环境我单独写了一篇,请看我的 ...
- ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统
一.创建项目 本篇文章介绍如何将一个ASP.NET Core Web程序部署到Windows系统上.这里以ASP.NET Core WebApi为例进行讲解.首先创建一个ASP.NET Core We ...
- 运行Vue在ASP.NET Core应用程序并部署在IIS上
前言 项目一直用的ASP.NET Core,但是呢我对ASP.NET Core一些原理也还未开始研究,仅限于会用,不过园子中已有大量文章存在,借着有点空余时间,我们来讲讲如何利用ASP.NET Cor ...
随机推荐
- java课设-计算数学表达式的程序,201521123050,肖世松,个人
1.团队课程设计博客链接 http://www.cnblogs.com/xss666/p/7063780.html 2.个人负责模块或任务说明 个人负责:计算器外观,左容器CalPanelL p1: ...
- 201521123014 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 异常(Exception)处理 异常(Exception)的概念:在程序运行的时候可能出错,Java中把程序出现的错 ...
- React Native 轻松集成分享功能(iOS 篇)
产品一直催我在 RN 项目中添加分享功能,一直没找到合适的库,今天让我看到了一个插件分享给大家. 在集成插件之前,需要在各大开放平台上成功注册应用,并通过审核(支持 3 个可选的主流平台).支持的平台 ...
- CustomDialog——一个多功能、通用、可自定义的Dialog
CustomDialog--一个多功能.通用.可自定义的Dialog 依赖 compile 'com.github.SiberiaDante:CustomDialog:v1.0.1' 说明[Cus ...
- JUDE-UML工具软件介绍
JUDE社区版(不考虑破-解). 现在Jude改名为Astah了.JUDE已停止发展,Astah是它的替代品.Jude有3个版: Professional版, Community版(免费),Share ...
- hibernate中Query的list和iterator区别
1.Test_query_list类 public class Test_query_iterator_list { public static void main(String[] args) { ...
- iOS开发之UITableView中计时器的几种实现方式(NSTimer、DispatchSource、CADisplayLink)
最近工作比较忙,但是还是出来更新博客了.今天博客中所涉及的内容并不复杂,都是一些平时常见的一些问题,通过这篇博客算是对UITableView中使用定时器的几种方式进行总结.本篇博客会给出在TableV ...
- js学习要点
js 一.词法结构 1.区分大小写 2.注意 // 单行 /* 多行注释 */ 3.字面量(直接量 literal) 12 //数字 5.8 // 小数 "hello" 'hell ...
- global,local,static的区别
1.在函数内部使用global关键字定义的变量可以成为全局变量,如果该变量已经被定义了,那么他的值就是原来的值,否则就是一个新的全局变量(一句话:已存在就不再创建): <?php $a=1; f ...
- 比较JqGrid与XtraGrid
此只能比较两者的功能优劣,实现某种功能.效果的方便性和效率.首先分别粗略介绍XtraGrid和jqGrid DevExpress是目前.net下最为强大和完整的UI控件库, XtraGrid是这个控件 ...