msbuild SLN e ainda obter os resultados dos projectos separados?
-
06-07-2019 - |
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?
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.