最近打算做一个公司的代码走查工具,思前想后觉得正好可以当作一个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)的更多相关文章

  1. 来个干货——使用VS2019发布.NET Core程序并部署到IIS的最新教程

    使用VS2019发布.NET Core程序并部署到IIS,不管你是使用.NET Core开发的是Web API还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.NET Core ...

  2. 关于.net core程序的部署

    最近发布.net core程序的时候,发现它是可以独立部署的,它支持如下两种部署方式: 依赖框架的部署FDD.只发布我们的程序,运行前用户需要手动安装.net core runtime. 独立部署SC ...

  3. 把Asp.net Core程序代码部署到Ubuntu(不含数据库)

    今天记录一下第一次把.net core 程序发布到linux系统.linux用的是ubuntu Server 18.04版本.运行的IDE是vs 2019,发布出来是.net core 2.2版本. ...

  4. 使用VS 2019发布.net core程序并部署到IIS的最新教程

    不管你是使用.net core开发的是web api还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.net core程序部署到IIS的朋友,可以看看这篇手把手教你部署.net ...

  5. 如何优雅的利用Windows服务来部署ASP.NET Core程序

    上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足 ...

  6. Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署

    运行环境 照例,先亮环境:软件的话我这里假设你已经批准好了.net core 运行环境,未配置可以看我的这篇[linux(centos)搭建.net core 运行环境] 腾讯云 centos:7.2 ...

  7. Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署

    运行环境 照例,先亮底 centos:7.2 cpu:1核 2G内存 1M带宽 辅助工具:xshell xftp 搭建.net core运行环境 .net core 的运行环境我单独写了一篇,请看我的 ...

  8. ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统

    一.创建项目 本篇文章介绍如何将一个ASP.NET Core Web程序部署到Windows系统上.这里以ASP.NET Core WebApi为例进行讲解.首先创建一个ASP.NET Core We ...

  9. 运行Vue在ASP.NET Core应用程序并部署在IIS上

    前言 项目一直用的ASP.NET Core,但是呢我对ASP.NET Core一些原理也还未开始研究,仅限于会用,不过园子中已有大量文章存在,借着有点空余时间,我们来讲讲如何利用ASP.NET Cor ...

随机推荐

  1. 06jQuery-01-基本选择器

    1.jQuery概要 JavaScript的一个库,只是一个jquery-xxx.js的文件,它可以让你写更少的代码,做更多的事. $是著名的jQuery符号.实际上,jQuery把所有功能全部封装在 ...

  2. 从JS和jQuery浅谈DOM操作,当我们在获取时,究竟获取了什么

    0.写在前面的话 自己对前端的东西一直不是很熟,现在开始要想办法从前端各个地方去获取想要的属性值的时候,也基本是在网上现炒现卖,几周下来,发现自己还是迷迷糊糊,可以算是一无所获. 所以就抽时间,把这一 ...

  3. 警惕Java编译器中那些“蜜糖”陷阱

    一.前言 随着Java编译器不断地向前发展,它为程序员们提供了越来越多的“蜜糖”(compiler suger),极大地方便了程序的开发,例如,foreach的增强模式,自动拆箱与装箱以及字符串的连接 ...

  4. hadoop2.x的变化

    HDFS Federation(HDFS联邦) HDFS有两个主要层: Namespace 由目录.文件和块组成:支持所有命名空间对文件和目录的操作. Block Storage Service 由B ...

  5. mybatis-generato的功能扩展

    项目代码地址:https://github.com/whaiming/java-generator 我在原有的基础上扩展了和修改了一些功能: 1.增加获取sqlServer数据库字段注释功能 2.Ma ...

  6. 学习率 Learning Rate

    本文从梯度学习算法的角度中看学习率对于学习算法性能的影响,以及介绍如何调整学习率的一般经验和技巧. 在机器学习中,监督式学习(Supervised Learning)通过定义一个模型,并根据训练集上的 ...

  7. ioc(Inversion of Control)控制反转和DI

    ioc意味着将你设计好的交给容器控制,而不是传统在你的对象中直接控制 谁控制了谁:传统的javaSE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象:而ioc是有专门一个容 ...

  8. extract-text-webpack-plugin打包css后出现图片引用路径不对问题

    在做项目过程中,发现引用了图片的less文件被extract-text-webpack-plugin打包过之后,里面的图片引用路径指向到了extract-text-webpack-plugin打包目录 ...

  9. OpenCV探索之路(二十五):制作简易的图像标注小工具

    搞图像深度学习的童鞋一定碰过图像数据标注的东西,当我们训练网络时需要训练集数据,但在网上又没有找到自己想要的数据集,这时候就考虑自己制作自己的数据集了,这时就需要对图像进行标注.图像标注是件很枯燥又很 ...

  10. Hibernate中的实体映射

     一.一对一映射  如人(Person)与身份证(IdCard) 的关系,即为一对一的关系,一个人只能有一张身份证,一张身份证只能属于某一个人,它们的关系图如下图所示: 在Person实体中添加一个属 ...