利用Powershell自動(dòng)部署asp.net mvc網(wǎng)站項(xiàng)目 (一)
這一篇中我們會(huì)寫一些關(guān)于自動(dòng)化部署的代碼。我們會(huì)使用Powershell書寫這類代碼。
你將發(fā)現(xiàn)這篇文章中涉及的東西非常具體,有的要求甚至相當(dāng)苛刻且可能不具有通用性。這是因?yàn)椴渴饛膩矶际歉h(huán)境打交道,部署過程中協(xié)作的組建太多,相互之間的交集不可能太大。可能唯一能夠通用的是自動(dòng)化部署的基本原則(只是這篇文章的基本原則):
- 每一次自動(dòng)化部署結(jié)束之后,應(yīng)用程序都會(huì)有相同的初始狀態(tài)。
- 自動(dòng)化部署的機(jī)器非常干凈,只有相應(yīng)的Windows Server系統(tǒng)和.NET Framework。尤其是,不會(huì)有 Visual Studio。
我們需要公開一些基本的環(huán)境信息:
- 64-bit Windows Server 2008/2012/2012 R2或者 64-bit Windows 7/8/8.1
- 我們的工程是使用Microsoft Visual Studio 2013開發(fā)的;
- .NET Framework版本為 4.5
- ASP.NET MVC的版本為 5.0.0
- Microsoft Build Tool的版本為 12.0
關(guān)于MSBuild這里需要多說幾句。在Visual Studio2013 發(fā)布之前,MSBuild是隨.NET Framework一起發(fā)布的。這意味著我們可以不用安裝Visual Studio就可以構(gòu)建 .NET 應(yīng)用程序。
這是多么美好的世界啊!因此,上一句話是假的。尤其是當(dāng)你構(gòu)建ASP.NETWeb 應(yīng)用程序的時(shí)候,你馬上就會(huì)遇到 “Cannot found … Webapplication.target” 的錯(cuò)誤。如果你 StackOverflow 一下就可以知道,我們需要做的是安裝Visual Studio或者從另外一臺(tái)安裝了Visual Studio的機(jī)器上將相關(guān)的文件拷貝出來。這真是——丟人的設(shè)計(jì)!linux 的擁躉又有了發(fā)泄的空間。
于是微軟決定正視這個(gè)問題。從Visual Studio2013 開始,MSBuild將與Visual Studio而不是.NET Framework一起發(fā)布。這引來了一片罵聲。我不得不說,大家在生活中不論遇到什么事情都要保持足夠的冷靜,往往先發(fā)脾氣的得不到任何的好處。事實(shí)是,由于.NET Framework發(fā)布的周期是相對(duì)較長的,因此微軟目前越來越傾向于使用 NuGet 進(jìn)行類庫的發(fā)布,這樣有助于削減.NET Framework基礎(chǔ)類庫的大小,并縮短基礎(chǔ)類庫的發(fā)布周期。相應(yīng)的MSBuild和Visual Studio的發(fā)布周期也希望進(jìn)行獨(dú)立的變化。MSBuild將和Visual Studio保持發(fā)布周期的一致性,并不意味這MSBuild依賴于Visual Studio。因此我們當(dāng)然可以下載MSBuild的獨(dú)立安裝包Microsoft Build Tools,并在一臺(tái)沒有Visual Studio的服務(wù)器上進(jìn)行自動(dòng)化構(gòu)建。
再次強(qiáng)調(diào),如果幸運(yùn),你可以直接運(yùn)行這篇文章中的例子。但是你不要指望將這篇文章的腳本拷貝到你的工程就可以正常工作。因?yàn)椴渴鹗且粋€(gè)因地制宜的任務(wù),需要具體分析。你可能會(huì)遇到各種各樣的環(huán)境問題,但是我認(rèn)為最重要的還是思路。
部署是什么
簡單來說,部署就是 “構(gòu)建(Build)” –> “拷貝” –> “配置”。那么我們就開始一個(gè)一個(gè)解決它。這一篇將著眼于構(gòu)建。
編譯和構(gòu)建應(yīng)用程序 – 思路
如何構(gòu)建應(yīng)用程序呢?答案是先把需要的東西都拷貝過來,然后再用工具構(gòu)建。好極了,我們需要拷貝什么東西呢?當(dāng)然是先把源代碼拷貝過來。
┌────────────────┐│ Src of MyApp │└────────────────┘
|
光源代碼還不行,因?yàn)槲覀兊某绦蛞蕾囉诘谌綆欤^代表依賴關(guān)系)。
┌────────────────┐│ Dependent libs │└────────────────┘ ↑┌────────────────┐ │ Src of MyApp │└────────────────┘
|
例如,對(duì)于我們構(gòu)建的那個(gè)簡簡單單的 ASP.NET MVC 5 的應(yīng)用程序,我們就需要在構(gòu)建之前下載它依賴的類庫:
- Microsoft.AspNet.Mvc 5.0.0
- Microsoft.AspNet.Razor 3.0.0
- Microsoft.AspNet.WebPages 3.0.0
- Microsoft.Web.Infrastructure 1.0.0.0
源代碼和依賴庫都拷貝完了,那么接下來我們就需要將構(gòu)建工具也拷貝過來:
┌────────────────┐│ Dependent libs │└────────────────┘ ↑┌────────────────┐ ┌───────────────────┐│ Src of MyApp │────→│Tools for compiling│└────────────────┘ └───────────────────┘
|
對(duì)于我們來說,構(gòu)建的工具只有一個(gè):
如今工具,源代碼一應(yīng)俱全,我們可以開始編譯了。
安裝 MSBuild
如果你做實(shí)驗(yàn)的機(jī)器上安裝了Visual Studio2013——ExPRess 版本的也是可以的——那么你可以跳過這一步,否則請下載Microsoft Build Tools并安裝。
下載應(yīng)用程序的代碼
我們的代碼是現(xiàn)成的,只需要從 git repository clone 下來就可以了。你也可以從這個(gè)地址 clone 到一個(gè)范例代碼,并轉(zhuǎn)換到相應(yīng)的 commit。
git clone https://github.com/lxconan/MvcFromZero.gitgit reset --hard 340abb32433c99975bd6485f79db6ca077119477
|
好了,完成了,到目前為止一切都是那么的輕松愉快。
下載應(yīng)用的依賴庫
我們將使用 nuget 管理包的依賴。因此我們首先要下載NuGet的命令行客戶端,可以從這里下載。
接下來的行為都需要明確的目錄結(jié)構(gòu)。為了便于說明,我們將建立如下的目錄結(jié)構(gòu)。
MvcFromZero |- src | |- FromZero.App | |- packages | |- build |- tools
|
其中,src 目錄存放 Solution 的源代碼,而 build 目錄存放自動(dòng)化構(gòu)建所需的各種工具和腳本。其中自動(dòng)化構(gòu)建需要的工具將放在 build/tools 目錄下。因此我們也會(huì)將 nuget.exe 放在這個(gè)目錄下。
接下來我們在 build 目錄下建立 deploy.ps1 腳本,我們將在這個(gè)腳本中完成接下來的任務(wù)。我們先來下載依賴的包。NuGet 的包管理是通過package.config文件進(jìn)行的。需要指出的是package.config也具有一定的層次關(guān)系。首先 Solution 級(jí)別的包信息存儲(chǔ)在兩個(gè)地方:
- 第一個(gè)是 Solution 目錄下的.nuget/package.config文件,這個(gè)文件中存儲(chǔ)的是非特定項(xiàng)目使用的包(如果并沒有這種類型的包,則該目錄不存在,或者該目錄下沒有任何文件);
- 第二個(gè)是 Solution 目錄下的packages/repositories.config文件,這個(gè)文件存儲(chǔ)了該解決方案下的每一個(gè)工程的packages.config文件的路徑。
而 Solution 下的每一個(gè) Project 的包定義存儲(chǔ)在 Project 目錄下的package.config中。
為了下載這些依賴的包是否需要人為遍歷這些config文件呢?原來是,而從 nuget 2.7 開始,可以直接支持 Solution 范圍內(nèi)的包下載,于是額我們就可以使用如下的簡單函數(shù)完成包的下載了。
Function Install-SolutionPackages() { iex "$global_nugetPath restore $global_solutionFilePath"}
|
其中,$global_nugetPath
是 nuget.exe 的路徑,而$global_solutionFilePath
是工程文件(在這里是 FromZero.App.csproj)的路徑。
接下來需要確定的是構(gòu)建工具的位置,我們可以使用注冊表查找MSBuild的位置的,由于我們使用了 2013 版本的MSBuild(Toolset 的版本號(hào)為 12.0),因此我們的查找腳本為:
Function Get-MsBuildPath() { $msBuildRegPath = "HKLM:/SOFTWARE/Microsoft/MSBuild/ToolsVersions/12.0" $msBuildPathRegItem = Get-ItemProperty $msBuildRegPath -Name "MSBuildToolsPath" $msBuildPath = $msBuildPathRegItem.MsBuildToolsPath + "msbuild.exe" return $msBuildPath}
|
上述兩步完成之后,就可以編譯我們的工程了:
Function Compile-Project() { iex -Command "& '$global_msBuildPath' $project_path"}
|
你迫不及待的試驗(yàn)了你的代碼,但是卻發(fā)現(xiàn)出了問題,MSBuild報(bào)告無法找到Microsoft.WebApplication.targets文件。這是怎么回事,我們已經(jīng)明明在MSBuild中安裝了Microsoft.WebApplication.targets了啊?這是因?yàn)闉榱吮3趾?em>Microsoft Visual Studio2010 SP1 的工程的兼容性,Visual Studio2012/2013 的工程默認(rèn)將$(VisualStudioVersion)
環(huán)境變量設(shè)置為10.0
。這樣,target 文件的查詢路徑就成了:
$(MSBuildExtensionsPath32)/Microsoft/VisualStudio/v10.0
|
而不是:
$(MSBuildExtensionsPath32)/Microsoft/VisualStudio/v12.0
|
因此我們需要修正這個(gè)環(huán)境變量。請使用文本編輯器打開FromZero.App.csproj文件,找到如下的定義:
<PropertyGroup> <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> <VSToolsPath Condition="'$(VSToolsPath)' == ''"> $(MSBuildExtensionsPath32)/Microsoft/VisualStudio/v$(VisualStudioVersion) </VSToolsPath></PropertyGroup>
|
將其中的VisualStudioVersion
節(jié)替換為:
<VisualStudioVersion>12.0</VisualStudioVersion>
|
再次運(yùn)行:祝賀你,你已經(jīng)能夠成功的下載所有的依賴,并完成工程的編譯了!在本文的結(jié)束,附上 deploy.ps1 到目前為止的所有代碼:
$ErrorActionPreference = 'Stop'# Environment helpers ------------------------------------Function Get-MsBuildPath() { $msBuildRegPath = "HKLM:/SOFTWARE/Microsoft/MSBuild/ToolsVersions/12.0" $msBuildPathRegItem = Get-ItemProperty $msBuildRegPath -Name "MSBuildToolsPath" $msBuildPath = $msBuildPathRegItem.MsBuildToolsPath + "msbuild.exe" return $msBuildPath}# Environment variables ----------------------------------$global_buildDirPath = Get-Location$global_msBuildPath = Get-MsBuildPath$global_solutionPath = "$global_buildDirPath/../src"$global_solutionFilePath = "$global_solutionPath/src.sln"$global_nugetPath = "$global_buildDirPath/tools/nuget.exe"# Install nuget packages ---------------------------------Function Install-SolutionPackages() { iex "$global_nugetPath restore $global_solutionFilePath"}$project_path = $global_solutionPath + '/FromZero.App/FromZero.App.csproj'Function Compile-Project() { iex -Command "& '$global_msBuildPath' '$project_path'"}Install-SolutionPackagesCompi
- u盤無法識(shí)別怎么辦,小編告訴你U盤無法識(shí)別怎
- usb無線網(wǎng)卡怎么用,小編告訴你安裝教程
- usb調(diào)試在哪,小編告訴你usb調(diào)試在哪
- 優(yōu)盤不顯示,小編告訴你優(yōu)盤不顯示怎么辦
- 低級(jí)格式化,小編告訴你硬盤怎么低級(jí)格式化
- 分區(qū)表丟失,小編告訴你分區(qū)表丟失如何修復(fù)
- 進(jìn)入bios,小編告訴你戴爾筆記本進(jìn)入bios設(shè)置u
- 怎么刷bios,小編告訴你華碩怎么刷bios
- 讀卡器怎么用,小編告訴你如何使用讀卡器
- bios升級(jí),小編告訴你華碩主板bios怎么升級(jí)
主站蜘蛛池模板:
久久久久久免费免费
|
日韩字幕在线观看
|
久久9色
|
国产成人精品网站
|
久久羞羞视频
|
51国产偷自视频区视频小蝌蚪
|
日韩视频一
|
一级免费观看
|
一级做a爱片毛片免费
|
午夜视频成人
|
中文字幕在线永久
|
黄色av片在线观看
|
黑人三级毛片
|
最新久久免费视频
|
热99精品视频|
免费毛片在线
|
日韩视|
91精品国产91热久久久做人人
|
中文字幕亚洲欧美
|
黄色香蕉视频
|
美国一级黄色毛片
|
少妇一级淫片免费放正片
|
最近免费观看高清韩国日本大全
|
精品久久久久久综合日本
|
7777视频|
中文字幕22页
|
欧美毛片
|
欧美性久久久
|
香蕉久久久精品
|
91成人一区
|
97风流梦电影
|
国产免费成人在线
|
国产精品99久久久久久宅女
|
美女视频免费一区二区
|
亚洲射情
|
高清av在线|
国产午夜精品一区二区三区嫩草
|
二区三区四区视频
|
精品亚洲视频在线
|
中文字幕欧美视频
|
中文字幕欧美亚洲
|
|