Отсутствуют двоичные ссылки второго уровня при веб-развертывании MSBuild

Я пытаюсь выполнить автоматическую сборку / развертывание веб-приложения на основе Jenkins (.NET 4.0). У проекта веб-приложения есть несколько ссылок на проекты, которые, в свою очередь, имеют двоичные ссылки на сторонние библиотеки DLL.

Проблема:

  1. Ссылки второго уровня (ссылки на проектные ссылки) не помещаются в папку bin в папке obj\<CONFIGURATION>\Package\PackageTmp\bin, которая используется для создания пакетов развертывания.
  2. Когда я создаю визуальную студию, ссылки второго уровня втягиваются в обычный выходной каталог сборки.
  3. При сборке с помощью MSBuild зависимости второго уровня не переносятся ни в обычный выходной каталог, ни в каталог PackageTmp\bin.

Это подтверждено MS как проблема, которая не будет устранена, здесь.

Связанные вопросы здесь, здесь и здесь либо не соответствуют моей проблеме, либо предлагают решения, которые не работают. Я просмотрел все ответы, а не только принятые.

Моя команда сборки выглядит так (с использованием MSBuild 4.0):

MSBuild MySolution.sln / p: Configuration = Integration / p: platform = "Any CPU" / t: Clean, Build / p: DeployOnBuild = true / p: DeployTarget = Package / p: AutoParameterizationWebConfigConnectionStrings = false

Я попытался вручную отредактировать ссылочные элементы в файлах проекта, добавив <Private>True</Private>, но безуспешно.

Я пытаюсь обойти эту известную проблему, чтобы мои зависимости второго уровня автоматически и правильно помещались во временный каталог веб-публикации.

Моя текущая попытка сочетает в себе общий подход, здесь (настройка конвейера веб-публикации путем добавления файла MyProject.wpp.targets рядом с файлом веб-проекта) в сочетании с некоторым кодом MSBuild для поиска библиотек DLL здесь. Пока это либо не дало результатов, либо файл проекта был поврежден. Я новичок в пользовательском коде MSBuild и считаю его довольно загадочным.

Мой вопрос: я ищу более полный пример, который работает в моем конкретном случае. Я думаю, что цель состоит в том, чтобы вмешаться в конвейер веб-публикации, который собирает файлы для копирования во временный каталог пакета и добавляет к нему зависимости второго уровня.

Мой собственный MyWebProj.wpp.targets выглядит так:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
      <BRPathFiles Include="$(SolutionDir)..\Common\**\*.dll;$(SolutionDir)**\*.dll" />
      <ConfigPathFiles Include="$(SolutionDir)..\Common\**\*.config;$(SolutionDir)**\*.config" />
    </ItemGroup>

    <Target Name="CopySecondLevelDependencies" BeforeTargets="CopyAllFilesToSingleFolderForPackage">
      <RemoveDuplicates Inputs="@(BRPathFiles->'%(RootDir)%(Directory)')">    
        <Output TaskParameter="Filtered" ItemName="BRPaths" />
      </RemoveDuplicates>
      <RemoveDuplicates Inputs="@(ConfigPathFiles->'%(RootDir)%(Directory)')">    
        <Output TaskParameter="Filtered" ItemName="ConfigPaths" />
      </RemoveDuplicates>    

      <CreateItem Include="%(BRPaths.Identity);%(ConfigPaths.Identity);">
        <Output ItemName="FileList" TaskParameter="Include"/>
      </CreateItem>

      <CreateItem Value="@(BRSearchPath);$(ConfigSearchPath)">
        <Output TaskParameter="Value" PropertyName="SecondLevelFiles" />
      </CreateItem>
    </Target>       
    <ItemGroup>
      <FilesForPackagingFromProject
        Include="%(SecondLevelFiles->'$(OutDir)%(FileName)%(Extension)')">
        <DestinationRelativePath>$(_PackageTempDir)\bin\%(FileName)%(Extension)       </DestinationRelativePath>
        <FromTarget>CopySecondLevelDependencies</FromTarget>
        <Category>Run</Category>
      </FilesForPackagingFromProject>
    </ItemGroup>
</Project>

person Udi Bar-On    schedule 07.03.2012    source источник


Ответы (1)


Предполагая, что вы собрали все библиотеки, необходимые во время выполнения, в папке за пределами вашего решения / проекта, пробовали ли вы просто использовать события после сборки, чтобы скопировать все эти библиотеки в целевой каталог основного проекта (bin), а затем включить этот каталог в свой пакет развертывания с использованием метода Сайедса: http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx (также доступно в этом сообщении: Как включить дополнительные файлы с помощью пакетов веб-развертывания VS2010?)?

У меня есть (среди прочего) следующая строка в событиях после сборки моего основного проекта:

xcopy "$(ProjectDir)..\..\Libraries\*.dll" "$(TargetDir)" /Y /S

В дополнение к этому я добавил в свой файл .csproj следующие строки:

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    PostBuildLibraries;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>
    <Target Name="PostBuildLibraries">
  <ItemGroup>
    <_PostBuildLibraries Include="$(TargetDir)**\*" />
    <FilesForPackagingFromProject Include="%(_PostBuildLibraries.Identity)">
      <DestinationRelativePath>$(OutDir)%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Обязательно добавьте эти строки после импорта «Microsoft.WebApplication.targets». Ознакомьтесь с приведенными выше ссылками для получения более подробной информации.

Это делает все нужные библиотеки доступными после каждой сборки (копируются в целевой каталог проекта) и каждый раз, когда я создаю пакет развертывания (копируемый в obj \ ‹CONFIGURATION› \ Package \ PackageTmp \ bin).

Кроме того, поскольку я создаю свой основной проект, а не свое решение, я использую макрос $(ProjectDir) вместо $(SolutionDir).

person Mattias Larsson    schedule 04.07.2012