Скрипт MSBUILD должен архивировать все сборки в решении после сборки, но получает только некоторые библиотеки DLL (при локальной сборке и сборке TFS)

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

  • Существует один проект (называемый MyApp.Packaging), который не содержит кода, только скрипт MSBUILD .targets.
  • В проекте есть ссылки на все остальные проекты, поэтому сборки выполняются последними (подтверждается при просмотре Порядка сборки проекта)
  • Сценарий сборки содержит следующее для идентификации и архивирования (с помощью задачи ZIP задач MSBUILD Community) файлов EXE и DLL в два разных пакета (есть другой код для извлечения номера версии из файла version.txt с использованием задач сообщества MSBUILD - опущен для ясность)
<!-- Set package name and input/output folders -->
<PropertyGroup>
    <PackageName>MyAppService</PackageName>
    <BuildTargetFolder>$(TargetDir)</BuildTargetFolder>
    <PackageOutputFolder>$(OutDir)</PackageOutputFolder>
</PropertyGroup>

<!-- Set location of files -->
<ItemGroup>
    <MyAppBinaries Include="$(BuildTargetFolder)*.exe$(BuildTargetFolder)*.dll;" Exclude="$(BuildTargetFolder)MyApp.Packaging.dll" />
    <MyAppOtherFiles Include="$(SolutionDir)MyApp.Packaging\InstallService.bat;$(SolutionDir)MyApp.Packaging\UnInstallService.bat;$(BuildTargetFolder)MyApp.HostService.exe.config" />
    <MyAppContracts Include="$(BuildTargetFolder)MyApp.Common.DataContext.dll;$(BuildTargetFolder)MyApp.Common.Shared.dll" />
</ItemGroup>

<!-- After building (in Release mode only), build the installation package -->
<Target Name="AfterBuild">
    <CallTarget Targets="BuildPackage" Condition="'$(Configuration)'=='Release'" />
</Target>

<!-- Build the package -->
<Target Name="BuildPackage">
    <!-- Package for installing the MyApp Service -->
    <Zip Files="@(MyAppBinaries);@(MyAppOtherFiles)" Flatten="True" WorkingDirectory="$(MSBuildProjectDirectory)" ZipFileName="$(PackageOutputFolder)\$(PackageName)_$(Major).$(Minor).$(Revision)_Install.zip" />
    <!-- Package for MyApp Contracts -->
    <Zip Files="@(MyAppContracts)" Flatten="True" WorkingDirectory="$(MSBuildProjectDirectory)" ZipFileName="$(PackageOutputFolder)\$(PackageName)_MyAppContracts_$(Major).$(Minor).$(Revision)_Install.zip" />
</Target>

Файлы ZIP создаются в месте размещения TFS, когда TFS выполняет сборку, или в папке bin проекта Packaging для локальной сборки.

Второй ZIP (содержащий 2 DLL) всегда создается нормально, при локальной сборке и сборке TFS.

Проблема в том, что когда TFS выполняет сборку, первый ZIP -файл не содержит EXE -файла и содержит только 2 из 23 DLL-файлов (и все 3 файла, идентифицированные MyAppOtherFiles). Когда сборка выполняется локально (и сначала очищается папка bin проекта Packaging), первый ZIP- файл не содержит EXE или DLL, а содержит только 2 .bat-файла, идентифицированных MyAppOtherFiles.

Если я изменю BuildTargetFolder с $(TargetDir) на $(OutDir), я получу тот же результат.

В определении сборки TFS используется неизмененный шаблон по умолчанию.

Это похоже на то, что когда TFS выполняет сборку, проект Packaging является третьим, а не последним, собираемым проектом, поэтому используется только 2 библиотеки DLL. Однако решение, проверенное в TFS, точно такое же, как и то, что я создаю локально, и в этом случае кажется, что скрипт не может видеть ЛЮБОЙ из двоичных файлов. Если локальная сборка выполняется снова (без очистки папки bin проекта Packaging), тогда ZIP-файлы содержат все необходимые файлы, но это очевидно потому, что после 1-й сборки папка bin теперь содержит EXE и все библиотеки DLL.

Также сбивает с толку тот факт, что при сборке TFS архив MyApp.HostService.exe.config (который создается сборкой) архивируется, но не MyApp.HostService.exe. И почему второй ZIP всегда создается нормально, когда он содержит библиотеки DLL, которые пропускаются в первом ZIP????? Я пытался поменять местами порядок создания ZIP, но это не имеет значения!

Что я могу сделать, чтобы гарантировать, что архивирование всегда выполняется после того, как все проекты собраны, как в локальной сборке, так и в сборке TFS?

Спасибо

2 ответа

Решение

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

Мы делаем что-то похожее, но у нас есть настройка определения сборки tfs для создания файла target / proj вместо sln. В файле target / proj у нас есть цель, которая компилирует наше приложение, а затем использует wix для создания msi. В вашем случае вы должны создать цель, которая использует цель msbuild для компиляции вашего exe-проекта, а затем вызвать цель zip для сжатия вывода. Вы можете оставить параметр outdir как наш, вы можете установить свойство, чтобы вывод шел в каталог по вашему выбору. Создание этого простого будет работать как на сервере TFS, так и локально.

Другие вопросы по тегам