本章我们将讲解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.weikejianghu.com/article/87244.htm
注意: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</div>
代码没有出错,但是并没有打开浏览器窗口,我们手工打开一个浏览器访问上述网址,即可看到该示例程序的界面,此时说明,该BookStore已经成功运行在5000端口了。其实该模式下的浏览器自动打开功能默认是关闭的,可以通过如下方式开启自动打开功能:
步骤:右键BookStore项目->属性->Debug选项卡,勾选Launch Brower复选框,并在输入框里输入上述网址即可(此时会在项目的Properties目录下生成一个debugSettings.json文件来保存上述信息)。
再次F5运行,即可看到自动打开的浏览器界面。
应用程序参数
在该Debug选项卡中,我们还看到一个应用程序参数(Application Arguments
)输入框,该输入框可以传入多种参数,这些参数可以在Startup.cs
里,通过Configuration
的AddCommandLine
方法进行收集并利用。
环境变量
同理,在Debug选项卡的最下面还有一个环境变量(Environment Variables
)输入框,可以让我们在调试的时候自定义一些环境变量的值(key/value),然后通过Configuration
的AddEnvironmentVariables
方法进行收集并利用。
上述参数和环境变量的具体使用方式,请参考配置信息管理章节。
发布流程分析
在之前的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]。</div>
通过查看输出信息,可以发现,编译成功,但复制的时候出错,可能是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></div>
通过查询相关信息(访问详情) ,得知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\D