Отсутствие бинарных ссылок второго уровня в веб-развертывании MSBuild - PullRequest
4 голосов
/ 08 марта 2012

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

Проблема:

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

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

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

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

MSBuild MySolution.sln / p: Конфигурация = Интеграция / p: платформа = "Любой ЦП" / t: Очистить, Build / p: DeployOnBuild = true / p: DeployTarget = Package / p: AutoParameterizationWebConfigConnectionStrings = false

Я пытался вручную редактировать элементы Reference в файлах проекта, добавляя <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>

1 Ответ

0 голосов
/ 04 июля 2012

Предполагая, что вы собрали все необходимые библиотеки во время выполнения в папке за пределами вашего решения / проекта, вы пытались просто использовать события после сборки, чтобы скопировать все эти библиотеки в основной целевой каталог проекта (bin), а затем включить этот каталог в ваш пакет развертывания с использованием метода Sayeds: 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 \ \ Package \ PackageTmp \ bin).

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

...