项目发布与部署

项目发布与部署

章我们将讲解ASP.NET5项目发布部署相关的内容,示例项目以我们前一章创建的BookStore项目为例。

发布前的设置

由于新版ASP.NET5支持多版本DNX运行环境的发布和部署,所以在部署之前,我们需要设定部署的目标DNX(即之前的KRE)。

步骤:右键BookStore项目->属性->Application选项卡,选择DNX的版本,本例中,选择dnx-coreclr-win-x64.1.0.0-beta4

project.json文件的commands节点,我们可以看到,系统默认配置了3个调试命令,分别如下:

命令 描述
web 启动WebListener服务,该服务可以让web程序脱离IIS运行,默认地址是http://localhost:5000。
gen 使用该命令可以生成MVC相关的代码,比如Controller,目前还用不到。
ef Entity Framework迁移命令,用于迁移数据使用,本例我们还用户不到。

理论上来说,我们F5运行的时候,应该是启动web命令,但是在VS2015中,默认的运行环境依然是IIS Express,所以F5调试的时候,会默认启动IIS Express。

gen参考:http://www.cnblogs.com/dudu/p/aspnet5-k-gen.html
注意:web模式和IIS Express模式的程序运行端口不一样。

我们先F5调试运行,启动IIS Express,打开页面,一切正常。重新选择默认模拟器环境为web,再F5运行,这时候发现弹出了一个命令行窗口,并提示如下文字:

[INFORMATION:Microsoft.NET.Http.Server.WebListener] Start
[INFORMATION:Microsoft.NET.Http.Server.WebListener] Listening on prefix: http://localhost:5000/
Started

代码没有出错,但是并没有打开浏览器窗口,我们手工打开一个浏览器访问上述网址,即可看到该示例程序的界面,此时说明,该BookStore已经成功运行在5000端口了。其实该模式下的浏览器自动打开功能默认是关闭的,可以通过如下方式开启自动打开功能:

步骤:右键BookStore项目->属性->Debug选项卡,勾选Launch Brower复选框,并在输入框里输入上述网址即可(此时会在项目的Properties目录下生成一个debugSettings.json文件来保存上述信息)。

再次F5运行,即可看到自动打开的浏览器界面。

应用程序参数
在该Debug选项卡中,我们还看到一个应用程序参数(Application Arguments)输入框,该输入框可以传入多种参数,这些参数可以在Startup.cs里,通过ConfigurationAddCommandLine方法进行收集并利用。

环境变量
同理,在Debug选项卡的最下面还有一个环境变量(Environment Variables)输入框,可以让我们在调试的时候自定义一些环境变量的值(key/value),然后通过ConfigurationAddEnvironmentVariables方法进行收集并利用。

上述参数和环境变量的具体使用方式,请参考配置信息管理章节。

发布流程分析

在之前的MVC程序中,我们一般都是通过右键项目,选择发布(Publish)的方式来发布程序的,这一次我们也来看看这种方式。

首先,右键->发布->Profile(选择File System)->选择D:\BookStore->选择Release/coreclr->下一步,最终点击发布。在在Output面板,我们看到出错了,错误信息如下:

正在连接到 D:\Documents\Visual Studio 2015\Projects\BookStore\BookStore\..\artifacts\bin\BookStore\Release\Publish...
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.DNX.Publishing.targets(342,5): 错误 : 错误: 无法识别规则“BackupRule”。
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.DNX.Publishing.targets(342,5): 错误 : 错误计数: 1。

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.DNX.Publishing.targets(342,5): 错误 : An error occured during publish.
The command ["C:\Program Files (x86)\IIS\Microsoft Web Deploy\msdeploy.exe" -source:contentPath=‘C:\Users\Administrator\AppData\Local\Temp\PublishTemp\‘ -dest:contentPath=‘D:\Documents\Visual Studio 2015\Projects\BookStore\artifacts\bin\BookStore\Release\Publish‘ -verb:sync -enableRule:DoNotDeleteRule -retryAttempts:2 -disablerule:BackupRule  ] exited with code [-1]。

通过查看输出信息,可以发现,编译成功,但复制的时候出错,可能是powershell的问题,所以返回上述步骤,在设置(Settings)选项卡下,将取消发布脚本(Publish Scripts)下的使用PowerShell脚本发布的复选框。重新发布,成功了。

打开发布目录D:\BookStore,发现生成了如下目录和文件:

目录或文件 描述
approot 应用程序目录
wwwroot 静态文件目录
gen linux shell命令文件
gen.cmd cmd命令文件
web linux shell命令文件
web.cmd cmd命令文件

看到cmd文件的扩展名,我们可以猜想这些命令是用于执行相关的命令,比如web.cmd可能就是用于启动程序的;而非cmd扩展名文件,我们则猜想可能是用于linux/mac运行的命令。

我们来试一下,点击web.cmd文件,该文件执行以后显示的信息和我们在Debug程序时弹出的信息一样,通过访问提示中的网址,我们可以验证应用程序已经正常运行了。这种模式即时我们所说的自宿主(Self-Host)运行模式。

再试一下IIS是否能够运行该程序,将IIS站点指向到wwwroot目录,打开网址,也是可以正常访问的。打开wwwroot文件夹进行查看,静态文件一应俱全,但是发现bin目录下并没有我们的项目DLL(BookStore.dll),而是多了一个AspNet.Loader.dll,而且根目录下还多了一个web.config文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="bootstrapper-version" value="1.0.0-beta4" />
    <add key="runtime-path" value="..\approot\packages" />
    <add key="dnx-version" value="1.0.0-beta4" />
    <add key="dnx-clr" value="coreclr" />
    <add key="dnx-app-base" value="..\approot\src\BookStore" />
  </appSettings>
</configuration>

通过查询相关信息(访问详情) ,得知AspNet.Loader.dll文件只是一个桥接文件,用于接收IIS转发过来的请求,然后将其转交给dnx进行运行,这里的web.config里的dnx以及项目信息的配置文件是AspNet.Loader.dll在转交请求时所需要的配置信息。

通过配置文件我们可以看到,这里配置了dnx的类型、版本号,程序集的路径和app的路径。打开approot\src\BookStore目录,我们发现,这里居然都是cs源码,虽然有个bin目录,但是里面也没有dll文件。而且在approot\packages文件夹下,居然有90个程序集文件夹(将近30M文件)。

通过查询网站的资料得知(这一部分内容,我们在下一节进行讲解),目前真正运行程序的运行环境是DNX,也被复制到approot\packages\dnx-coreclr-win-x64.1.0.0-beta4目录中, 而该项目依赖的所有程序集(包括System开头的)都被复制到该packages目录下了。目的就是要做到真正的跨平台运行,也就是说,将这些文件复制到linux系统下,只要有对应版本的KRE(本例中的DNX是Windows版本的)的话,就可以正常运行该程序。

而bin目录下没有dll文件,则是使用了微软最新的动态编译技术,即在运行的过程中,自动编译cs文件,而且一旦修改这些cs文件的话,系统将会自动再次进行编译。(感觉有点像php等脚本语言了)。虽然动态编译很高效,但是还是没有编译好的dll高效,所以微软还提供了一个选项让开发人员在调试的时候生成dll文件。具体步骤如下:

右键BookStore->属性->Build选项卡,勾选编译时生成输出(Produce outputs on build)复选框。

重新编译程序,发现在BookStore\artifacts\bin\BookStore\Debug目录下的2个DNX版本文件夹下都分别生成了BookStore.dll文件了,而且还顺带了Nuget的spec文件。

如果在发布的时候也要生成dll文件,则需要在发布(Publish)设置里进行修改,步骤如下:

右键BookStore->发布(Publish)->Settings选项卡->File Publish Options->勾选Precompile during publishing复选框。

这样就可以生成响应的dll文件, 但是这些dll文件依然不在wwwroot/bin目录下,而是在approot\packages\BookStore\1.0.0目录下,在该目录下有2个文件夹,分别是libroot,以及相关的Nuget的spec文件,在lib目录下,生成的是不同dnx版本的dll文件,而root则是类似于之前的web根目录,因为在该目录下除了有视图文件以外,还和以前的结构一样,保留了bin目录,并且在bin目录下的Release文件夹下,也有一份针对不同dnx版本的dll文件副本。

提示:上述选择中,另外一个Delete all existing files prior to publish也可以勾选上,以便在发布时将之前发布版本的所有文件全部清空。

此时,我们通过web.cmd文件或者IIS模式来验证发布的文件,经验证,均可以正常运行。再仔细对比两份不同设在的发布文件,发现,除了dll文件以外,web.config文件的应用程序路径也变了,即从原来的:

<add key="kre-app-base" value="..\approot\src\BookStore" />

变成了如下版本:

<add key="kre-app-base" value="..\approot\packages\BookStore\1.0.0\root" />

而web.cmd文件的内容,也从如下内容:

@"%~dp0approot\packages\dnx-coreclr-win-x64.1.0.0-beta4\bin\dnx.exe" --appbase "%~dp0approot\src\BookStore" Microsoft.Framework.ApplicationHost web %*

变成了如下内容:

@"%~dp0approot\packages\kre-coreclr-win-x64.1.0.0-beta4\bin\dnx.exe" --appbase "%~dp0approot\packages\BookStore\1.0.0\root" Microsoft.Framework.ApplicationHost web %*

上述变化,我们是可以理解的,即将src源码动态编译运行的模式修改为预编译dll程序集的模式。所以,在这里我们可以看到,在源码动态编译模式下,其发布后的文件夹结构如下:

//源码动态编译模式
wwwroot/bin/Microsoft.AspNet.Loader.IIS.dll
wwwroot/Contents/site.css
wwwroot/Contents/.......................................
........................................................
wwwroot/Scripts/jquery.js
wwwroot/Scripts/........................................
........................................................
........................................................
approot/src/BootStore/project.json
approot/src/BootStore/...............................
approot/src/BootStore.Data/project.json
approot/src/BootStore.Data/..............................
approot/src/BootStore.Bussiness/project.json
approot/src/BootStore.Bussiness/.........................
approot/packages/Elmah/{version}/.......................
........................................................

而dll预编译模式下的发布文件夹结构如下:

//dll预编译模式
wwwroot/bin/Microsoft.AspNet.Loader.IIS.dll
wwwroot/Contents/site.css
wwwroot/Contents/.......................................
........................................................
wwwroot/Scripts/jquery.js
wwwroot/Scripts/........................................
........................................................
........................................................
approot/packages/BootStore/{version}/...................
approot/packages/BootStore.Data/{version}/..............
approot/packages/BootStore.Bussiness/{version}/.........
approot/packages/Elmah/{version}/.......................

IIS和web.cmd模式的不同

虽然我们对dnx内容的原理不太理解,但有一点内容,我们要记住,那就是两种模式下,对静态文件的访问模式可能不太一样。原因是因为,虽然IIS模式的根目录就是存放静态文件的地方,但是web.cmd文件事先启动的却是approot\src\BookStore目录或approot\packages\BookStore\1.0.0\root目录,两个目录下均没有静态文件,因为静态文件时在wwwroot目录下的,我们猜想,在这种模式下,肯定会有一种机制在来映射这些静态文件,通过查找文件发现,在approot\src\BookStore目录下的project.json文件中的webroot键的值,从解决方案中默认的wwwroot变成了"../../../wwwroot",也就是说kre在映射静态文件的时候,应该是根据这个相对目录来查找这些文件的。

同理,approot\packages\BookStore\1.0.0\root目录下的project.json文件中的webroot键的值,也从wwwroot变成了"../../../../../wwwroot"(因为本来project.json文件的层级就深)。

由于IIS是通过AspNet.Loader.dll做中转,将请求转交给DNX来运行的,那么在IIS模式下,静态文件的请求到底是IIS来处理,还是KRE来处理呢?我们来验证一下,验证步骤如下:

  1. 创建一个wwwroot2文件夹和wwwroot同级,并将wwwrooot目录下的静态文件剪切到wwwroot2目录下。
  2. project.json(如果是预编译模式,则需要修改root目录下的project.json)文件中的webroot值中的wwwroot修改为wwwroot2
  3. 继续以IIS模式运行该站点

结果发现,静态文件访问不了了(CSS、JS、Images均失效了),但我们再通过web.cmd运行时,这些静态文件却又可以访问了。由此得知,在IIS模式下,静态文件走的是IIS的管线Pipeline,而不是DNX的关系Pipeline。

两种发布模式下的project.json文件不同

动态编译模式和预编译dll模式这两种模式的自动发布程序,生成后的project.json文件有一些变化,具体变化如下。

动态编译模式
基本上和解决方案里的project.json文件相同,唯一的不同就是webroot的相对路径的修改。

预编译dll模式
原来引用的众多程序集从dependencies节点中移除了,取而代之的是BookStore程序集引用,示例如下:

  "dependencies": {
    "BookStore": "1.0.0"
  },

另外,还多了如下两个节点值(具体功能暂不明确):

  "entryPoint": "BookStore",
  "loadable": false

猜想,这些不同,可能是因为在动态编译模式下需要引用这些被移除的程序集进行编译,而预编译dll模式下,都已经编译好了,所以就不再需要这些程序集了,而root目录只需要引用BookStore程序集就可以了,而BookStore程序集对这些程序集的依赖,详细在该dll程序集的nupkg文件里是可以自动解析并下载的吧(这一点待验证)。

以上是新版ASP.NET5项目在发布流程和相关技术的一些内容,从这里大家可以看到,ASP.NET5是彻底模块化了,IIS不再是运行MVC程序的唯一容器,任何兼容DNX的运行容器都可以运行MVC程序,程序发布包被分为approot和wwwroot两个部分,分别存放应用程序集(或源码)和静态文件,从而做到更好的分离。在下一章,我们会讨论,ASP.NET 5的运行原理。

注意:目前还没有办法通过复制源码的形式来进行调试,同时也没办法将IIS指向到源码中进行调试,这将会改变开发人员的开发习惯。

同步与推荐

本文已同步至目录索引:解读ASP.NET 5 & MVC6系列

时间: 2024-10-09 07:23:03

项目发布与部署的相关文章

解读ASP.NET 5 &amp; MVC6系列(3):项目发布与部署

原文:解读ASP.NET 5 & MVC6系列(3):项目发布与部署 本章我们将讲解ASP.NET5项目发布部署相关的内容,示例项目以我们前一章创建的BookStore项目为例. 发布前的设置 由于新版ASP.NET5支持多版本DNX运行环境的发布和部署,所以在部署之前,我们需要设定部署的目标DNX(即之前的KRE). 步骤:右键BookStore项目->属性->Application选项卡,选择DNX的版本,本例中,选择dnx-coreclr-win-x64.1.0.0-beta4.

Django项目发布 环境部署(中)

python环境部署 我们今天学习的内容是如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境: 在这里首先强调一下,Centos7系统自带的Python2我们不要删除,我们要做的是在Python2和python3并存. 1.  安装Python3的依赖包 2.  命令: [[email protected] Desktop]# yum install zlib-devel bzip2-devel open

Django项目发布 环境部署(下)

上一篇完成了python的安装,接下来安装python的依赖包和项目的依赖包 1.  python-devel 命令:yum -y install python-devel 安装Django1.8.2 pillow django-ckeditor5.4.0 pip3 install django==1.8.2 pip3 install pillow pip3 install django-ckeditor==5.4.0 python uwsgi 上面我们已经完成了python+Django环境的

向net core 3.0进击——多平台项目发布与部署

前言 在经历过好多折腾后,总算是把部署走通了一遍,之前只是简单创建个工程在linux下部署,后来一直将这件事搁置,直到最近刚好团队入手一个小服务器,很显然是linux的,那就没啥说的了,Come On! 发布 在这个时候我挺想也秀一把命令行,什么dotnet build啊,publish什么的,但是还是老老实实用我的宇宙第一神器吧. 右键工程发布. 这个地方我引用下官网的介绍. 依赖框架 优点: 不需要设置部署的系统,因为都是通用的pe文件,这就是跨平台很嗨皮的地方 部署包小 允许程序使用net

VS2010把项目发布、打包成可安装部署的应用程序

本文要解决的问题: 详细介绍用VS2010将项目发布.打包成可部署的应用程序的过程,通过一步步操作,最后能顺利完成. 1. 在vs2010 选择"新建项目"à" 其他项目类型"à" Visual Studio Installerà "安装项目": 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1."应用程序文件夹"表示要安装的应用程序需要添加的文件: 2."用户的'程序'菜单"表

阿里云服务器Web Deploy配置和使用Visual Studio进行Web项目发布部署遇到的坑

阿里云的服务器一直闲着,烧着银子,当初花几千大洋开通,本想弄信息化的项目为所帮扶的贫困户脱贫助手,不想势单力薄,一直没有找到好的项目.最近大家都在众志成城抗击新肺疫情,于是又想能不能尽点自己的力量,于是又开始打开Visual Studio 鼓捣起项目来,为了测试与微信服务器的消息发送,每次都得把项目发布到阿里的去服务器上,由于以前一直没怎么用,发布的方法是采用最原始的复制,然后远程桌面粘贴上去.次数多了感觉太累了,比较的方法,一个是FTP方式,另一个是Web Deploy,FTP方式虚拟主机一直

eclipse 项目发布到tomcat中(转)

转来的,有侵权联系删除 Eclipse的web工程至Tomcat默认的部署目录是在工程空间下,本文旨在将部署目录改为Tomcat安装目录,并解决依赖包输出问题. 1.在Eclipse中添加Tomcat服务器. 2.将web工程发布至tomcat: 选择刚添加的Tomcat: 此时Eclipse将自动生成Servers工程: 3.在Servers视图,Remove删除刚刚发布的项目: 4.打开Tomcat服务器配置项: 5.修改以下两个配置项,Tomcat保持启动状态,否则Server Locat

用批处理来自动化项目编译及部署(附Demo)

阅读目录 介绍 详细 处理 结论 Demo下载 介绍 一个项目从立项开始,可能就已经根据公司的配置模板将目录,文档结构定义出来.有动态库,也有静态库,在没有专门的CMO的时候,往往组长,若干开发人员承担版本发布的工作.次工作即枯燥,又容易出错,那么怎么样才能将这样的工作略微自动化点.以下就通过很简单的很古老的批处理来略微自动化下. 详细 一:目录结构 每个公司的目录结构不一样,当略有相同,比如:管理库,需求库,设计库,代码库,引用库(包库),资源库,编译模板库,编译版本库,发布版本库等.如下图:

InfoPath本地发布及部署

前言 最近在接触SharePoint项目,第一次接触,总感觉有些不适应.以前只是听过,现在要遇见了,有些小紧张.今天改了一下表单的东西,也是对sharepoint的慢慢熟悉过程,分享给初学,或者未学者. 过程 从tfs获取要改的infopath表单,打开表单开始修改.修改完后.因为我们每个表单是有那么一个对应代码,就是把表单生成代码才能够发布.所以首先要做的是代码,如图: 代码完成后,要做的就是将表单发布,这个跟我们在vs中发布自己的网站到本地其实一样,如图: 然后就一直下一步,到要你选择要发布