2010-11-16 94 views
19

我把我的頭髮拉出這個MSBuild問題。如何避免MSDeploy使用MSBuild的文件系統的深層文件夾結構?

我們正在使用TeamCity構建一個包含兩個MVC網站的解決方案。作爲構建的一部分,我們將部署到構建服務器上的文件夾。 IIS指向這個文件夾,爲我們提供一個管理可見的集成構建。

以下是使用MSDeploy發佈程序包的MSBuild文件中的代碼 - 但不是作爲zip文件。

<Target Name="Deploy"> 
    <MSBuild 
    Projects="$(SolutionFile)" 
    Properties="Platform=$(Platform);Configuration=$(Configuration); 
    DeployOnBuild=true; 
    DeployTarget=Package; 
    PackageLocation=$(PackageLocation); 
    PackageAsSingleFile=False; 
    AutoParameterizationWebConfigConnectionStrings=False" /> 
</Target> 

這裏的問題是我們得到了令人難以置信的深層文件夾結構。下面是一個例子...

C:\ DEPLOY \ Archive \ Content \ C_C \ Users \ Edmond \ Documents \ Visual Studio 2008 \ CreatioGreen \ Creatio \ Code \ core \ trunk \ Website \ Website \ obj \ Release \ Package \ PackageTmp [發佈文件]

我真的要部署到像預測的文件夾...

C:\建立\網站[發佈文件] C:\建立\ mobilewebsite [發佈文件]

這就是背景。以下是具體的問題。

  1. 我們在嘗試使用MSDeploy發佈到本地文件系統時犯了錯誤嗎?我們基本上需要相當於VS2010的「發佈」功能,並進行配置轉換。我們不是試圖部署到遠程IIS實例或任何東西。

  2. 有沒有辦法做到這一點,但指定發佈文件夾?

  3. 我一直在嘗試使用MSBuild的複製任務將文件複製到更合理的文件夾 - 但我不能解決如何使用通配符來指定我們需要採取的文件夾 - 它需要是像...

C:\ FolderPackageEndsUpIn [ANYFOLDERS] \網站[ANYFOLDERS] \ PackageTmp * *。

幫助!

回答

3

您可以直接使用WebDeploy來獲得更加優化的結果。通過使用iisApp提供商,而不是dirPath

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:dirPath=<SourceFolder> -dest:dirPath=<DestinationFolder>

也可以使WebDeploy包括關於目的地IIS配置:例如,可以使用下面的命令來同步2個文件夾直接根 - 根

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp=<SourceFolderOrIISPath> -dest:iisApp=<DestinationFolderOrIISPath>

例如,從一個簡單的文件夾同步到默認網站下一個新的應用程序「NEWAPP」,你會這樣調用它:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp="d:\MyWebSite" -dest:iisApp="Default Web Site/NewApp"

然後,您可以擁有一個批處理文件,它將通過直接調用WebDeploy來執行同步/打包,並將作爲構建後事件執行。

+0

謝謝回答,kateroh!這有幫助。 – centralscru 2010-11-23 15:08:06

+0

我這樣做直到我發現我無法讓Web.config轉換工作。任何想法如何做到這一點,而不使用包目標? – 2011-03-31 13:31:14

+0

您可以通過制定跳過替換規則來解決Web.config轉換的這個問題,該規則將使web部署跳過同步web.config並將web.release.config替換爲web.config。這是一篇關於跳過替換規則的博客文章,以幫助您開始:http://blogs.iis.net/msdeploy/archive/2008/05/23/how-to-write-skip-and-replace-rules-for- msdeploy.aspx – kateroh 2011-03-31 21:16:58

19

如果將_PackageTempDir參數添加到MSBuild,它將爲您提供與本地發佈相同的結果。例如

的MSBuild C:\ PathToMyProj.csproj/P:配置= UAT; DeployOnBuild = TRUE; PackageAsSingleFile = FALSE; DeployTarget =套餐; _PackageTempDir = C:\ PathToMyDeploy \; AutoParameterizationWebConfigConnectionStrings =假

該命令將發佈所有我的文件到c:\ PathToMyDeploy \沒有瘋狂的子文件夾

1

有一個稍微隱藏但優雅的解決方案。

在共享CI服務器上運行構建時,出於隔離原因可能很難打包在c:root中。人們最終寧願去除包裝本身的深層路徑。

幸運的是有一個解決方案。在.pubxml文件中添加替換規則!我發現它在補充毫秒內構建引擎,第2版:https://www.microsoft.com/learning/en-us/book.aspx?ID=16854

我還發現,在這個博客:http://learnaspmvc.blogspot.se/2014/07/web-packaging-fixing-long-path-issue.html

相關問題