麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

利用Powershell自動(dòng)部署asp.net mvc網(wǎng)站項(xiàng)目 (一)

2019-11-17 01:36:56
字體:
供稿:網(wǎng)友

利用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)的MSBuildVisual 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è):

  • MSBuild

如今工具,源代碼一應(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
          發(fā)表評(píng)論 共有條評(píng)論
          用戶名: 密碼:
          驗(yàn)證碼: 匿名發(fā)表
          主站蜘蛛池模板: 久久久久久免费免费 | 日韩字幕在线观看 | 久久9色 | 国产成人精品网站 | 久久羞羞视频 | 51国产偷自视频区视频小蝌蚪 | 日韩视频一 | 一级免费观看 | 一级做a爱片毛片免费 | 午夜视频成人 | 中文字幕在线永久 | 黄色av片在线观看 | 黑人三级毛片 | 最新久久免费视频 | 热99精品视频| 免费毛片在线 | 日韩视| 91精品国产91热久久久做人人 | 中文字幕亚洲欧美 | 黄色香蕉视频 | 美国一级黄色毛片 | 少妇一级淫片免费放正片 | 最近免费观看高清韩国日本大全 | 精品久久久久久综合日本 | 7777视频| 中文字幕22页 | 欧美毛片 | 欧美性久久久 | 香蕉久久久精品 | 91成人一区 | 97风流梦电影 | 国产免费成人在线 | 国产精品99久久久久久宅女 | 美女视频免费一区二区 | 亚洲射情 | 高清av在线| 国产午夜精品一区二区三区嫩草 | 二区三区四区视频 | 精品亚洲视频在线 | 中文字幕欧美视频 | 中文字幕欧美亚洲 |