2010-10-15 57 views
4

我有一個非常奇怪的問題,我已經創建了一個自定義MSBuild任務,將我需要爲我的MVC項目的所有文件移動到特定位置,以便我們可以發佈它。當我在我的機器上觸發本地腳本時,此工作正常,但只要我檢查此更改並且Teamcity運行腳本,它就會複製除Bin文件夾以外的所有內容。 但是,如果直接從命令行(同一腳本)運行MSbuild,它會複製bin文件夾。我不明白爲什麼在TeamCity構建它時這不起作用。Bin文件夾不被複制與MSBuild,Teamcity

有沒有人有一個想法,爲什麼發生這種情況,以及如何解決它?

<Target Name="AfterBuild"> 
    <CallTarget Targets="Move" /> 
</Target> 
<Target Name="Move"> 
    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" /> 
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" /> 
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" /> 
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" /> 
</Target> 


<ItemGroup> 
    <BinFolder Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*"/> 
    <ContentFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Content\*.css"/> 
    <ImagesFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Images\*.*"/> 
    <ScriptsFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Scripts\*.js"/> 
</ItemGroup> 

$(ArtifactsDir)是paramanter我從TeamCity的&通過在命令行手動。

/p:ArtifactsDir="%system.agent.work.dir%\WebProject\trunk\Website" 
+0

你的構建腳本的其餘部分是什麼樣的 - 在哪裏聲明$(ArtifactsDir)和$(BinFolder)? – stack72 2010-10-15 14:23:23

+0

在上面添加了更多信息。 – MrW 2010-10-15 15:46:25

回答

5

我認爲這是一個項目評估問題。您的「BinFolder」項目在MsBuild首次讀取構建文件時進行解釋,即在構建之前。我認爲$(ProjectDir)bin ***。*在構建之前是空的。爲了避免這種情況,你可以在你的目標範圍內聲明的binfolder如圖所示:

<Target Name="AfterBuild"> 
    <CallTarget Targets="Move" /> 
</Target> 
<Target Name="Move"> 

    <ItemGroup> 
     <BinFolder Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" /> 
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" /> 
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" /> 
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" /> 
</Target> 

<ItemGroup> 
    <ContentFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Content\*.css"/> 
    <ImagesFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Images\*.*"/> 
    <ScriptsFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Scripts\*.js"/> 
</ItemGroup> 

否則你可以嘗試使用CreateItem任務:

<Target Name="Move"> 

    <CreateItem Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*"> 
     <Output TaskParameter="Include" ItemName="TheFiles"/> 
    </CreateItem> 

    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" /> 
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" /> 
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" /> 
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" /> 
</Target> 

您可以在這裏找到更多的信息:

+0

真的很有意思的答案。我認爲這可能是沿着這條線的東西,但從來沒有想過bin文件夾位置的實際刪節。我會馬上嘗試。 – MrW 2010-10-15 16:36:48

+0

目標(您的第一個示例)中「@(BinFolder)」的刪除解決了此問題。非常感謝! – MrW 2010-10-15 16:57:27

+0

是的,這個問題與目標之外的項目在任何目標執行之前被評估的事實有100%的關係。僅供參考此問題與CallTarget錯誤無關,對於MSBuild 4,您不需要使用CreateItem。把ItemGroup放在目標裏面幾乎是一樣的。 – 2010-10-16 01:27:58

相關問題