Pergunta

Eu tenho um arquivo SLN normal, e eu estou a compilá-lo bem com msbuild a partir da linha de comando. Eu faço isso:

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

E despeja tudo em C: \ slnbin, exceto para sites, que são distribuídos para C:. \ Slnbin_PublishedWebsites \

O que eu gostaria é não só tem todos os binários caiu na dir bin, mas também têm cada programa executeable tem própria pasta que é "implantado", semelhante ao que cada site recebe.

Assim, por exemplo, se eu tiver os seguintes projetos: - comum - Lib1 - Service1 - Lib2 - Service2

I wan para obter:

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

Eu tentei fazer coisas como "msbuild / p: OutDir = C: \ slnbin \ $ (ProjectName)", mas ele só trata como um literal e cria um "(ProjectName) $" subdir real.

De preferência, gostaria de não ter de modificar cada projeto individual e assim por diante.

Isso é possível? Fácil?

Foi útil?

Solução

Tal como John Saunders disse, você precisa ter um arquivo mestre MSBuild que lida com o processo.

Aqui está um exemplo usando Tarefas MSBuild Comunidade : GetSolutionProjects que obtém os projectos para uma determinada solução

<?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>

Outras dicas

Você vai ter que fazer isso "à mão". Criar um arquivo de projeto mestre MSBUILD que constrói a solução, em seguida, copia todas as saídas de soluções onde quer que eles. Este é (aproximadamente) como o Visual Studio Team Desenvolver o faz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top