2009-03-06 4 views
0

Ich habe einige seltsame Probleme beim Kopieren von Dateien in einem benutzerdefinierten Skript in TFS2008 ohne SP1, ich muss den Build mehrmals ausführen, um die Dateien zu kopieren (die meiste Zeit ist es im zweiten Build, dass ich die Dateien bekomme), lass mich dir die Details geben:TFS2008 rekursiv Kopieren von Dateien funktioniert nicht immer (Kompilieren vs2003) (AfterCompile Ziel)

Dies passiert mit ASP-Websites und VS2003 Web-Lösungen, (vs2008 Lösungen sind in Ordnung) In ASP habe ich eine Dummy 2008 Lösung, der Build kompiliert diesen Dummy, überschreibe ich AfterCompile und dort kopiere ich alle Dateien an den Ablageort In VS 2003 habe ich auch eine Dummy-Lösung 2008, der Build kompiliert zuerst den Dummy, überschreibe ich AfterCompile, verwende " Exec "und" Command "zum Kompilieren der 2003 soluti an und dann kopieren Sie die Dateien an den Ablageort.

Wie Sie sehen können, sind beide Ansätze ähnlich, ich habe keine Probleme mit den Builds per se, mein Problem ist auf zwei Arten reproduzierbar (und ja, ich überprüfe, aktualisiere, checke ein und teste dann den Build):

  1. einen neuen Build erstellen, um das Skript konfigurieren, um die Build zum ersten Mal, einige DLL im Ordner ist nicht kopiert werden, führen Sie den Build zum zweiten Mal und ich erhalte alle Dateien ausgeführt werden.

  2. Build bereits konfiguriert und läuft OK, fügen Sie eine Datei zum Projekt hinzu (dies geschieht meistens mit den ASP-Sites), führen Sie den Build, nicht diese neue Datei, führen Sie den Build erneut und ich bekomme diese neue Datei .

Hier ist mein Build-Skript für eine VS2003 Web-Lösung als Beispiel

<PropertyGroup> 
<TasksPath>D:\BuildTools\</TasksPath> 
    <VS2003Devenv>D:\Archivos de programa\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.com</VS2003Devenv> 
    <VS2003VirtualFolder>CnbvPifWeb</VS2003VirtualFolder> 
    <VS2003Suba>Cnbv.Pif.Web</VS2003Suba> 
    <VS2003Project>Cnbv.Pif.Web</VS2003Project> 
    <VS2003WebSiteName>Sitio Web predeterminado</VS2003WebSiteName> 
    <VS2003Configuration>Release</VS2003Configuration> 
    <VS2003Branch>Desarrollo</VS2003Branch> 
    <VS2003RelativePath>$(SolutionRoot)\$(VS2003Branch)\$(VS2003Suba)\</VS2003RelativePath> 
    <VS2003SolutionPath>$(VS2003RelativePath)Cnbv.Pif.Web.sln</VS2003SolutionPath> 
    <VS2003LocalFolder>$(VS2003RelativePath)Sources\$(VS2003Project)\</VS2003LocalFolder> 
    <VS2003Output>$(BinariesRoot)\$(VS2003Project)\</VS2003Output> 
    <VS2003CachePath>C:\Documents and Settings\srvfoundation\VSWebCache\230-2555-CPU015\</VS2003CachePath> 
    <VS2003ProjectExtension>vbproj</VS2003ProjectExtension> 
    <VS2003CacheFile>$(VS2003CachePath)$(VS2003VirtualFolder)\_vti_pvt\$(VS2003Project).$(VS2003ProjectExtension).cache</VS2003CacheFile> 
</PropertyGroup> 
<Import Project="$(TasksPath)Microsoft.Sdc.Common.tasks"/> 
<UsingTask TaskName="Microsoft.Sdc.Tasks.Web.WebSite.CreateVirtualDirectory" AssemblyFile="Microsoft.Sdc.Tasks.dll" /> 
<UsingTask TaskName="Microsoft.Sdc.Tasks.Web.WebSite.DeleteVirtualDirectory" AssemblyFile="Microsoft.Sdc.Tasks.dll" /> 
<ItemGroup> 
    <!--list of ouput files, excluding .DLL outside bin and some other files--> 
     <VS2003OutputFiles 
      Include="$(VS2003LocalFolder)**\*.*" 
      Exclude="$(VS2003LocalFolder)**\*.vb;$(VS2003LocalFolder)**\*.cs;$(VS2003LocalFolder)**\*.resx;$(VS2003LocalFolder)**\*.vspscc;$(VS2003LocalFolder)**\*.csproj;$(VS2003LocalFolder)**\*.vbproj;$(VS2003LocalFolder)**\*.scc;$(VS2003LocalFolder)**\*.webinfo;$(VS2003LocalFolder)**\*.snk;$(VS2003LocalFolder)**\*.dll;$(VS2003LocalFolder)**\*.exe;" /> 
    <!-- copy dll to bin folder --> 
     <VS2003OutputBinFiles 
     Include="$(VS2003LocalFolder)bin\*.dll"/> 
</ItemGroup> 
<Target Name="AfterCompile"> 
<Message Text="Deleting cache file" /> 
    <Microsoft.Build.Tasks.Delete 
     Condition="Exists('$(VS2003CacheFile)')" 
     Files="$(VS2003CacheFile)" /> 
    <Message Text="Creating virtual folder $(VS2003VirtualFolder) in IIS in local path $(VS2003LocalFolder)" /> 
    <Web.WebSite.CreateVirtualDirectory 
     VirtualDirectoryName="$(VS2003VirtualFolder)" 
     Path="$(VS2003LocalFolder)" 
     WebSiteName="$(VS2003WebSiteName)" /> 
    <Message Text="Compiling $(VS2003Project) in $(VS2003Branch)" /> 
    <Exec 
     Command="&quot;$(VS2003Devenv)&quot; &quot;$(VS2003SolutionPath)&quot; /build $(VS2003Configuration) /out &quot;$(VS2003LocalFolder)$(VS2003Project).log&quot; "/> 
    <Message Text="Eliminando la carpeta virtual $(VS2003VirtualFolder) en IIS" /> 
    <Web.WebSite.DeleteVirtualDirectory 
     WebSiteName="$(VS2003WebSiteName)" 
     VirtualDirectoryName="$(VS2003VirtualFolder)" /> 
    <MakeDir Condition="!Exists('$(VS2003Output)')" Directories="$(VS2003Output)" /> 
    <Message Text="Copying output files @(VS2003OutputFiles)" /> 
    <Copy 
     SourceFiles="@(VS2003OutputFiles)" 
     DestinationFiles="@(VS2003OutputFiles->'$(VS2003Output)%(RecursiveDir)%(Filename)%(Extension)')" 
    /> 
    <MakeDir Condition="!Exists('$(VS2003Output)bin\')" Directories="$(VS2003Output)bin\" /> 
    <Message Text="Copying DLL to bin folder @(VS2003OutputBinFiles)" /> 
    <Copy 
     SourceFiles="@(VS2003OutputBinFiles)" 
     DestinationFiles="@(VS2003OutputBinFiles->'$(VS2003Output)bin\%(Filename)%(Extension)')" 
    /> 
    <OnError ExecuteTargets="VS2003Fail" /> 
</Target> 
    <Target Name="VS2003Fail"> 
<Message Text="Copying log file $(VS2003RelativePath)$(VS2003Project).log" /> 
    <Copy Condition="Exists('$(VS2003RelativePath)$(VS2003Project).log')" SourceFiles="$(VS2003RelativePath)$(VS2003Project).log" DestinationFolder="$(DropLocation)\$(BuildNumber)" /> 
    <CallTarget ContinueOnError ="true" Targets ="CreateWorkItemWhenPartialSucceed" /> 
</Target> 
<Target 
     Name="CreateWorkItemWhenPartialSucceed" 
     Condition=" '$(SkipWorkItemCreation)'!='true' and '$(IsDesktopBuild)'!='true' "> 
     <Message Text="ejecutando work" /> 
     <PropertyGroup> 
      <WorkItemTitle>$(WorkItemTitle) $(BuildNumber)</WorkItemTitle> 
      <BuildLogText>$(BuildlogText) &lt;ahref='file:///$(DropLocation)\$(BuildNumber)\BuildLog.txt'&gt;$(DropLocation)\$(BuildNumber)\BuildLog.txt&lt;/a &gt;.</BuildLogText> 
      <ErrorWarningLogText  Condition="!Exists('$(MSBuildProjectDirectory)\ErrorsWarningsLog.txt')"></ErrorWarningLogText> 
     <ErrorWarningLogText Condition="Exists('$(MSBuildProjectDirectory)\ErrorsWarningsLog.txt')">$(ErrorWarningLogText) &lt;a href='file:///$(DropLocation)\$(BuildNumber)\ErrorsWarningsLog.txt'&gt;$(DropLocation)\$(BuildNumber)\ErrorsWarningsLog.txt&lt;/a &gt;.</ErrorWarningLogText> 
     <WorkItemDescription>$(DescriptionText) %3CBR%2F%3E $(BuildlogText) %3CBR%2F%3E $(ErrorWarningLogText)</WorkItemDescription> 
    </PropertyGroup> 
     <CreateNewWorkItem 
     TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
    BuildUri="$(BuildUri)" 
    BuildNumber="$(BuildNumber)" 
    Description="$(WorkItemDescription)" 
    TeamProject="$(TeamProject)" 
    Title="$(WorkItemTitle)" 
    WorkItemFieldValues="$(WorkItemFieldValues)" 
    WorkItemType="$(WorkItemType)" 
    ContinueOnError="true" /> 
</Target> 

Wenn ich sehe, die ouput dieser Nachricht im Protokoll

<Message Text="Copying DLL to bin folder @(VS2003OutputBinFiles)" /> 

das erste Mal, dass ich sehe nur der Name einer Datei, das zweite Mal druckt es alle richtigen Dateien, und das gleiche passiert mit den ASP-Seiten, wenn ich eine Datei hinzufügen, sehe ich die Datei in der Ausgabe im zweiten Build.

Ich hoffe, Sie können mir helfen, dies herauszufinden, vielen Dank.

Juan Zamudio

Antwort

0

dies war die Antwort im tfs Forum von OsirisJakob

Das Problem ist, dass Sie Ihre Artikelgruppen auf der Stammebene definieren. Dies bedeutet, dass sie sofort beim Laden der Projektdatei ausgewertet werden. Sie möchten, dass sie bei der Ausführung des AfterCompile-Ziels ausgewertet werden.

Da Sie TFS 2008 ausführen, können Sie dieses Problem lösen, indem Sie die Artikelgruppen in das AfterCompile-Ziel verschieben (siehe auch Dynamische Artikelgruppen). Dies führt dazu, dass die Artikelgruppe bis zur Ausführung des AfterCompile-Ziels ausgewertet wird und Ihnen das korrekte Ergebnis liefert.