msbuild SLN и все еще получать отдельные результаты проекта? - PullRequest
11 голосов
/ 10 марта 2009

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

13 голосов
/ 10 марта 2009

Как сказал Джон Сондерс, вам нужно иметь основной файл 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>
1 голос
/ 10 марта 2009

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

...