最近打算做一个公司的代码走查工具,思前想后觉得正好可以当作一个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. 单例模式(Singleton)看了就懂

    单例,故名思议,一个只能创建一个实例的类. 单例被广泛应用于Spring的bean(默认).线程池.数据库连接池.缓存,还有其他一些无状态的类如servlet. 一个没必要多例的类实现了单例可以节约空 ...

  2. Play使用

        play框架   打包命令: play war e:/codes/cn.ngmc.frontend -o f:/backup_ngmc/20160614frontend_001Dev; 即:p ...

  3. oracle-外连接left join的应用

    需求 自助设备交易统计 输入项 类型 可为空 备注 机构 选择 Y 采用下拉框的形式 终端号 手输 Y 与柜员号二选一 交易柜员号 手输 与终端号二选一 时间 选择 N 时间区间 状态 多选 设备状态 ...

  4. Apache2.4 + Tomcat7 负载均衡配置

    一.配置tomcat 多启动 1.下载免安装版 tomcat7 http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.81/bin/apache-t ...

  5. htt p第一章概述

    http的概述 1 web客户端与服务器是如何通信 2 web资源来自的何方 3 web事务是怎样的工作的 4 http通信所使用的报文结构 5 底层tcp的传输的结构 6不同的http协议体 什么是 ...

  6. linux 命令随笔 ls cd pwd mkdir rm mv cp cat nl

    Linux 命令练习 ls命令 ls就是list的简写,目的是打印当前目录下的清单 格式 ls[选项][目录名] 常用参数 -a –all 列出目录下的所有文件,包括以 . 开头的隐含文件 -l 除了 ...

  7. appium整理文档

    from appium import webdriver import time,unittest,HTMLTestRunner class Testlogin(unittest.TestCase): ...

  8. java集合系列——Map介绍(七)

    一.Map概述 0.前言 首先介绍Map集合,因为Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的). 1:介绍 将键映射到 ...

  9. 实例讲解webpack的基本使用第三篇

    这一篇来讲解一下webpack的htmlWebpackHtml插件的使用. 先来思考一个实际问题:我们现在在index.html引用的js文件是写死的.但是我们每次打包后的文件都是动态的,那么我们怎么 ...

  10. uvalive 3029 City Game

    https://vjudge.net/problem/UVALive-3029 题意: 给出一个只含有F和R字母的矩阵,求出全部为F的面积最大的矩阵并且输出它的面积乘以3. 思路: 求面积最大的子矩阵 ...