在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本章我们将讲解ASP.NET5项目发布部署相关的内容,示例项目以我们前一章创建的BookStore项目为例。 发布前的设置 由于新版ASP.NET5支持多版本DNX运行环境的发布和部署,所以在部署之前,我们需要设定部署的目标DNX(即之前的KRE)。 步骤:右键BookStore项目->属性->Application选项卡,选择DNX的版本,本例中,选择 在
理论上来说,我们F5运行的时候,应该是启动web命令,但是在VS2015中,默认的运行环境依然是IIS Express,所以F5调试的时候,会默认启动IIS Express。 gen参考:https://www.ogeek.net/article/87244.htm 我们先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运行,即可看到自动打开的浏览器界面。 应用程序参数 环境变量 上述参数和环境变量的具体使用方式,请参考配置信息管理章节。 发布流程分析 在之前的MVC程序中,我们一般都是通过右键项目,选择发布(Publish)的方式来发布程序的,这一次我们也来看看这种方式。 首先,右键->发布->Profile(选择File System)->选择 正在连接到 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,发现生成了如下目录和文件:
看到cmd文件的扩展名,我们可以猜想这些命令是用于执行相关的命令,比如 我们来试一下,点击 再试一下IIS是否能够运行该程序,将IIS站点指向到 <?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> 通过查询相关信息(访问详情) ,得知 通过配置文件我们可以看到,这里配置了 通过查询网站的资料得知(这一部分内容,我们在下一节进行讲解),目前真正运行程序的运行环境是 而bin目录下没有dll文件,则是使用了微软最新的动态编译技术,即在运行的过程中,自动编译cs文件,而且一旦修改这些cs文件的话,系统将会自动再次进行编译。(感觉有点像php等脚本语言了)。虽然动态编译很高效,但是还是没有编译好的dll高效,所以微软还提供了一个选项让开发人员在调试的时候生成dll文件。具体步骤如下:
重新编译程序,发现在 如果在发布的时候也要生成dll文件,则需要在发布(Publish)设置里进行修改,步骤如下:
这样就可以生成响应的dll文件, 但是这些dll文件依然不在wwwroot/bin目录下,而是在 提示:上述选择中,另外一个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文件事先启动的却是 同理, 由于IIS是通过 创建一个 结果发现,静态文件访问不了了(CSS、JS、Images均失效了),但我们再通过web.cmd运行时,这些静态文件却又可以访问了。由此得知,在IIS模式下,静态文件走的是IIS的管线Pipeline,而不是DNX的关系Pipeline。 两种发布模式下的project.json文件不同 动态编译模式和预编译dll模式这两种模式的自动发布程序,生成后的project.json文件有一些变化,具体变化如下。 动态编译模式 预编译dll模式 "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指向到源码中进行调试,这将会改变开发人员的开发习惯。 |
请发表评论