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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top