2012-02-27 63 views
1

我們正在使用MSDeploy和Web部署項目來使用TFS構建(TFS 2010和VS 2010)來部署我們的網站項目。MSDeploy不會接受部署目標的動態路徑

TFS生成發送內置的文件到指定的投遞文件夾的子文件夾,所以如果我指定的投遞文件夾爲:

\\machineName\Builds

構建項目投進:

\\machineName\Builds\1. Test\20120226.38\Deploy

在該示例中,「1.測試」是TFS構建定義的名稱,「20120226.38」是日期標記和內部版本號,「部署」是Web部署項目的名稱。

當我在Deploy.wdproj文件中創建我的DeploySource項目組並指定MSDeploy源的確切路徑(請參閱下面的直接)時,一切正常。例如:

 
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Test|AnyCPU' "> 
    <DeploySource Include="DirPath"> 
     <Path>C:\Builds\1. Test\20120226.39\_PublishedWebsites\Deploy</Path> 
     <ComputerName>machineName</ComputerName> 
     <UserName>$(UserName)</UserName> 
     <Password>$(Password)</Password> 
    </DeploySource> 
</ItemGroup> 

爲了說明修改版本號和日期,我已經added a $(BuildNumber) variable via the DefaultTemplate.xaml file。所以,這裏的微妙變化的例子:

 
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Test|AnyCPU' "> 
    <DeploySource Include="DirPath"> 
     <Path>C:\Builds\1. Test\$(BuildNumber)\_PublishedWebsites\Deploy</Path> 
     <ComputerName>machineName</ComputerName> 
     <UserName>$(UserName)</UserName> 
     <Password>$(Password)</Password> 
    </DeploySource> 
</ItemGroup> 

而且他們傳遞到此MSDeploy電話:

 
<MSDeploy Condition=" '$(Configuration)|$(Platform)' == 'Test|AnyCPU' " 
    Whatif="$(WhatIf)" 
    Verb="sync" 
    Source="@(DeploySource)" 
    Destination="@(DeployDest0)" 
    ExePath="$(MSDeployPath)" 
/> 

這裏是我的問題:

實例1以上,一切都很好,和構建網站部署到正確的位置。

用實施例2的上方時,得到下面的錯誤:

 
MSDEPLOY: Object of type 'dirPath' and path '\\machineName\Builds\1. Test\20120227.2\_PublishedWebsites\Deploy' cannot be created. 
MSDEPLOY: (2/27/2012 6:54:14 PM) An error occurred when the request was processed on the remote computer. 
MSDEPLOY: Object of type 'dirPath' and path '\\machineName\Builds\1. Test\20120227.2\_PublishedWebsites\Deploy' cannot be created. 
MSDEPLOY: Could not find directory '\\machineName\Builds\1. Test\20120227.2\_PublishedWebsites\Deploy'. 
MSDEPLOY: Could not find a part of the path '\\?\UNC\machineName\Builds\1. Test\20120227.2\_PublishedWebsites\Deploy'. 

檢出和手動更改版本號是不實際的。我覺得這裏有一些簡單的東西,但我不能把它放在手指上。

注意:這是一個網站項目,而不是一個Web應用程序項目。時間限制和黑盒廠商依賴性將不允許轉換。

+0

問題的生成位置:在你工作的例子你硬編碼的版本號,是預在您調用命令之前文件夾存在的現有構建?如果是這樣,那麼我猜測問題可能是操作的順序,這意味着當您評估路徑並運行MSDeploy時,您用$(BuildNumber)指示的文件夾不存在,而是稍後創建構建過程。 – 2012-02-28 04:23:35

+0

我已經試過這兩個預先存在的路徑,並與建立將創建的新路徑。不幸的是,在這兩種情況下結果都一樣 – 2012-02-28 15:45:23

+0

你有沒有試過使用$(OutDir),因爲我的答案表明? – 2012-02-28 15:47:47

回答

3

如果在您的工作示例中,您已經對構建編號進行了硬編碼,則在調用該命令之前,構建輸出文件夾已存在,那麼我猜測問題可能是操作的順序,這意味着您的文件夾在評估路徑並運行MSDeploy時,用$(BuildNumber)表示的路徑不存在,而是稍後在構建過程中創建。
事實上,我敢打賭,你需要使用另一個TFS變量來表示相似

$(OutDir)\_PublishedWebsites\Deploy 
+0

我感到很傻,我只是意識到OutDir將允許我從構建服務器而不是從放置位置進行部署。除非我擁有XAML文件,否則我無法從放置位置進行部署(我認爲)。如果我找到正確的路徑,它應該可以工作。在將此標記爲答案之前,我可能只需要弄清路徑。謝謝尼克! – 2012-02-28 21:51:37

+0

坦白地說,我很驚訝$(OutDir)沒有工作,因爲我相信它與最終的複製位置不一樣。 TFS2010使用工作流來執行構建前和構建後的任務,這樣在MSBuild完成後,在CodeActivity中複製到放置共享。另一個選擇可能是使用$(BinariesRoot)(請查看關於TFS構建屬性的MSDN文章http://msdn.microsoft.com/en-us/library/aa337598.aspx) – 2012-02-28 21:58:51

+0

再次感謝Nick,我已經解決了所有的糾結。 – 2012-02-28 22:52:01