msbuild SLN y aún así obtener resultados de proyectos separados?
-
06-07-2019 - |
Pregunta
Tengo un archivo SLN normal y lo estoy compilando bien con msbuild desde la línea de comandos. Hago esto:
C: \ slndir > msbuild / p: OutDir = C: \ slnbin \
Y descarga todo en C: \ slnbin, excepto los sitios web, que se implementan en C: \ slnbin_PublishedWebsites \.
Lo que me gustaría es que no solo se eliminen todos los archivos binarios en el directorio bin, sino que también se haga que cada programa ejecutable tenga su propio " desplegado " carpeta, similar a lo que obtiene cada sitio web.
Entonces, por ejemplo, si tengo los siguientes proyectos: - Común - Lib1 - Servicio1 - Lib2 - Servicio2
Quiero obtener:
C:\slnbin\ // Everything
C:\slbin\Deploy\Service1 // Common, Lib1, Service1
C:\slbin\Deploy\Service2 // Common, Lib2, Service2
Intenté hacer cosas como & ms; msbuild / p: OutDir = C: \ slnbin \ $ (ProjectName) " ;, pero solo lo trata como un literal y crea un real " $ (ProjectName) " subdir.
Preferiblemente, no tendría que modificar cada proyecto individual, etc.
¿Es esto posible? ¿Fácil?
Solución
Como dijo John Saunders, debe tener un archivo MSBuild maestro que maneje el proceso.
Aquí hay una muestra usando Tareas de la comunidad MSBuild : GetSolutionProjects que obtiene los proyectos para una solución dada
<?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>
Otros consejos
Tendrá que hacer esto "a mano". Cree un archivo de proyecto MSBUILD maestro que construya la solución, luego copie todos los resultados de la solución donde los desee. Así es (aproximadamente) cómo lo hace Visual Studio Team Build.