TFS2008 рекурсивное копирование файлов не всегда работает (компиляция vs2003) (цель AfterCompile) - PullRequest
0 голосов
/ 06 марта 2009

У меня возникают некоторые странные проблемы с копированием файлов в нестандартном скрипте в TFS2008 без SP1, мне приходится запускать сборку несколько раз, чтобы скопировать файлы (в большинстве случаев во второй сборке я получаю файлы) Позвольте мне дать вам подробную информацию:

Это происходит с сайтами ASP и веб-решениями VS2003 (решения vs2008 в порядке) В ASP у меня есть фиктивное решение 2008 года, сборка компилирует этот фиктивный файл, я перезаписываю AfterCompile, и там я копирую все файлы в папку для перетаскивания В VS 2003 у меня также есть решение dummy 2008, сборка сначала компилирует dummy, я перезаписываю AfterCompile, использую «Exec» и «Command», чтобы скомпилировать решение 2003, а затем скопировать файлы в папку «drop».

Как вы видите, оба подхода одинаковы, у меня нет проблем со сборками как таковыми, моя проблема воспроизводима двумя способами (и да, я проверяю, обновляю, проверяю и затем проверяю сборку) :

  1. Создайте новую сборку, настройте скрипт, запустите сборку в первый раз, некоторые библиотеки DLL в папке bin не скопированы, запустите сборку во второй раз, и я получу все файлы.

  2. Сборка уже настроена и работает. ОК, добавьте файл в проект (в основном это происходит с сайтами ASP), запустите сборку, не получайте этот новый файл, снова запустите сборку, и я получу эту новую файл.

Вот мой сценарий сборки для веб-решения VS2003 в качестве примера

<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> 

Когда я вижу выход этого сообщения в журнале

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

в первый раз, когда я вижу только имя одного файла, во второй раз он печатает все правильные файлы, и то же самое происходит с сайтами ASP, если я добавляю файл, я вижу файл в выходных данных во второй сборке .

Надеюсь, вы мне поможете разобраться, большое спасибо.

Хуан Самудио

1 Ответ

0 голосов
/ 13 мая 2009

это был ответ на форуме tfs OsirisJakob

Проблема в том, что вы определяете группы товаров на корневом уровне. Это означает, что они оцениваются сразу после загрузки файла проекта. Вы хотите, чтобы они оценивались при выполнении цели AfterCompile.

Поскольку вы работаете с TFS 2008, вы можете решить эту проблему, переместив группы элементов в цель AfterCompile (a.k.a. Динамические группы элементов). Это приведет к оценке группы элементов к моменту выполнения цели AfterCompile и даст вам правильный результат.

...