2012-07-11 58 views
9

我想獲得一個MSBuild腳本來構建和提取部署一個相當大的Web應用程序。 (我們在幾十個目錄中討論了幾千個文件,在這裏它幾乎是一個繼承的,遺留的代碼庫,所以我不能做很多事情。)構建本身運行良好,但我似乎無法複製文件到放置位置正常工作。複製構建輸出文件,保留目錄結構,給路徑上的「非法字符」

下面是一個片段顯示我有什麼在構建腳本:

<PropertyGroup Condition=" '$(UseBuildNumber)' == 'true' "> 
    <ReleaseDirectory>$(ReleaseBaseDirectory)$(ReleaseName)\$(BuildNumber)</ReleaseDirectory> 
</PropertyGroup> 

<ItemGroup> 
    <OutputFiles Include=" 
       $(SourceRoot)**\*.aspx; 
       $(SourceRoot)**\*.dll; 
       $(SourceRoot)**\*.gif; 
       $(SourceRoot)**\*.ascx; 
       " /> 
</ItemGroup> 

<Message Text="Output files ==> @(OutputFiles)" /> 

<Copy 
    SourceFiles="@(OutputFiles)" 
    DestinationFolder="$(ReleaseDirectory)" 
    SkipUnchangedFiles="false" 
    /> 

我已經擺在那裏了一些額外的<Message/>,以驗證各個路徑正確地擴大,都$(SourceRoot)$(ReleaseDirectory)確實有正確的路徑。然而,在輸出中,我得到(省略掉了簡潔完整路徑):

Task "Message" 
    Output files ==> ...\Requirement1866**\*.aspx;...\Requirement1866**\*.dll;...\Requirement1866**\*.gif;...\Requirement1866**\*.ascx 
Done executing task "Message". 

顯然,通配符擴展尚未進行,下面Copy然後(可預見不夠)失敗。我只包括一個;實際上,這對於每個文件名稱通配符模式都是重複的(反過來,它比我在上面的構建腳本片段中包含的要多得多)。

Using "Copy" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 
Task "Copy" 
    Copying file from "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". 
    Command: 
    copy /y "*basedir*\Requirement1866**\*.aspx" "*targetdir*\Requirement1866\*buildnumber*\*.aspx" 
d:\Builds\215\BuildType\TFSBuild.proj(120,5): error MSB3021: Unable to copy file "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". Illegal characters in path. 

依次爲:

d:\Builds\215\BuildType\TFSBuild.proj(120,5): error MSB3021: Unable to copy file "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". Illegal characters in path. 

唯一合理的相關命中我也碰到過在我的努力,在谷歌上搜索,這是Copy Task - Illegal characters in path,但我已經使用<ItemGroup><CreateItem>例子(改編)根本沒有工作,提前中止說錯誤,說TaskParameter是未知的(對不起,我沒有在我面前的確切的錯誤信息)。

作爲一種臨時措施,我可以從構建輸出目錄手動複製相關文件到我想要的位置,但我希望該過程能夠自動化。

那麼,如何使用MSBuild將在構建過程中創建的文件複製到輸出目錄中,同時保留相對目錄結構,而不一一列出?

+0

我沒有直接的答案,但我也遇到過這個問題。我最終編寫了一個PowerShell腳本來完成它,並將其稱爲後構建操作。此外,這個問題+1,因爲它是令人印象深刻的研究。我期待着發佈正確答案! – allquixotic 2012-07-11 14:42:51

回答

20

基本上,**是單路徑元件並且因此必須在Include指令相應反斜槓分隔:

<ItemGroup> 
    <OutputFiles Include=" 
       $(SourceRoot)\**\*.aspx; 
       $(SourceRoot)\**\*.dll; 
       $(SourceRoot)\**\*.gif; 
       $(SourceRoot)\**\*.ascx; 
       " /> 
</ItemGroup> 

注指定例如之間的差$(SourceRoot)\**\*.aspx而不是破碎的$(SourceRoot)**\*.aspx。如果$(SourceRoot)\結束,通配符擴展可能最初也會起作用。

其次,在<Copy/>,使用%(RecursiveDir)

<Copy 
    SourceFiles="@(OutputFiles)" 
    DestinationFolder="$(ReleaseDirectory)\%(RecursiveDir)" 
    SkipUnchangedFiles="false" 
    /> 

隨着這些變化,它似乎工作,就像我希望它:文件拷貝到預定的目標目錄,並在源目錄結構保存在目標位置。

2

另一種建議是,不要爲每個文件類型添加Includes,而是很容易添加Excludes。

<ItemGroup> 
    <OutputFiles Include="$(SourceRoot)**\*.*" Exclude="$(SourceRoot)**\*.cs;$(SourceRoot)**\*.resx" " /> 
</ItemGroup> 

這種方式輸出將包括所需的任何JS,HTML,DHTML和其他文件類型。

+0

任何一種方法都可以工作,這取決於您的需求。在我的具體情況中,列舉我想要複製的內容並簡單地排除其他所有內容就顯得更加容易。 – 2013-01-10 18:52:13

相關問題