Msbuild SLN и все еще получать отдельные результаты проекта?

У меня есть обычный SLN файл, и я компилирую его с помощью msbuild в командной строке. Я делаю это:

C:\slndir > msbuild/p: OutDir = C:\slnbin\

И он выгружает все в C:\slnbin, за исключением веб-сайтов, которые развертываются в C:\slnbin_PublishedWebsites \.

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

Итак, например, если у меня есть следующие проекты:  - Общие  - Lib1  - Сервис1  - Lib2  - Service2

Я хочу получить:

  C:\slnbin\ // Everything
  C:\slbin\Deploy\Service1 // Common, Lib1, Service1
  C:\slbin\Deploy\Service2 // Common, Lib2, Service2

Я пробовал делать такие вещи, как "msbuild/p: OutDir = C:\slnbin\$(ProjectName)", но он просто рассматривает его как литерал и создает фактический поддиск "$ ProjectName".

Предпочтительно, мне не пришлось бы изменять каждый отдельный проект и так далее.

Возможно ли это? Легко?

Ответ 1

Как сказал Джон Сондерс, вам нужно иметь главный файл MSBuild, который обрабатывает этот процесс.

Вот пример с помощью Задачи сообщества MSBuild: GetSolutionProjects, который получает проекты для данного решения

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Package">

  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

  <!-- Specify here, the solution you want to compile-->
  <ItemGroup>
    <Solution Include="C:\slndir\solution.sln"/>
  </ItemGroup>

  <PropertyGroup>
    <Platform>AnyCPU</Platform>
    <Configuration>Debug</Configuration>

    <!-- Your deployment directory -->
    <DeployDir>C:\slbin\Deploy</DeployDir>
  </PropertyGroup>

  <!-- Gets the projects composing the specified solution -->
  <Target Name="GetProjectsFromSolution">
    <GetSolutionProjects Solution="%(Solution.Fullpath)">
      <Output ItemName="ProjectFiles" TaskParameter="Output"/>
    </GetSolutionProjects>
  </Target>

  <Target Name="CompileProject" DependsOnTargets="GetProjectsFromSolution">
    <!-- 
      Foreach project files
        Call MSBuild Build Target specifying the outputDir with the project filename.
    -->
    <MSBuild Projects="%(ProjectFiles.Fullpath)"
             Properties="Platform=$(Platform);
             Configuration=$(Configuration);
             OutDir=$(DeployDir)\%(ProjectFiles.Filename)\"
             Targets="Build">
    </MSBuild>
  </Target>
</Project>

Ответ 2

Вам придется делать это "вручную". Создайте главный файл проекта MSBUILD, который создает решение, а затем копирует все выходные решения, где он им нужен. Это (примерно), как это делает Visual Studio Team Build.