2010-11-24 17 views
8

En Visual Studio, puede descargar un proyecto, y cuando crea la solución (clic con el botón derecho/construir), el proyecto descargado no se genera. Sin embargo, cuando ejecuta MSBuild desde la línea de comando, así;Ejecute MSBuild, respete los proyectos descargados

C:\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe 
    "$slnFile" /t:build /p:Configuration=Debug /verbosity:minimal 

el proyecto es construido. ¿Hay alguna manera de que MSBuild respete los proyectos descargados en Visual Studio?

La situación es que tenemos una solución con una serie de proyectos. Uno de ellos requiere un software especial para compilar, y eso existe en nuestra máquina de compilación, pero no en todas las máquinas de desarrollo. Esto significa que no puedo hacer una compilación de línea de comandos correcta o falla cuando se encuentra con el proyecto deshonesto.

¿Alguna idea?

[EDITAR: MSBuild debe poder hacer esto, porque Visual Studio usa MSBuild para hacer el edificio. ¿Qué hace VS que la línea de comando no lo hace?]

+0

Cuando se crea Visual Studio, lo más probable es que pase explícitamente los proyectos a compilar en MSBuild en lugar del archivo de solución. Así es como puede omitir proyectos. Mi respuesta detalla un método alternativo que hará lo que quieras. – adrianbanks

Respuesta

6

MSBuild no sabe nada sobre el estado cargado del proyecto dentro de una solución, por lo que lo que está tratando de hacer no es posible.

Como alternativa, puede definir una nueva configuración de compilación llamada BUILD_MACHINE (utilizando el menú Build -> Configuration Manager). En esta configuración de compilación, habilite todos sus proyectos para ser construidos. Esta es la configuración que construyes en tu máquina (s) de construcción. Si deshabilita el proyecto específico para compilar en las configuraciones de generación Debug y Release (usando las mismas opciones de menú), puede compilar estas configuraciones en su máquina de desarrollo sin tener que descargar el proyecto que no desea compilar.

MSBuild rinde homenaje a las configuraciones de compilación, por lo que puedes construir tus configuraciones de compilación de máquinas no compiladas (por ejemplo, Debug, Release) usando Visual Studio o MSBuild y no se construirá el proyecto problemático.

1

la información sobre si un proyecto está descargado o no no entra en el archivo sln, sino en el archivo xxx.user. Por lo tanto, MSBuild no lo sabe.

Su mejor opción es crear un archivo de MSBuild simple que contiene sólo aquellos proyectos que se pueden construir en todas partes, por ejemplo:

<!--build selection of projects--> 
<Project 
    ToolsVersion="3.5" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
    <DevMachine Include="A\b.vcproj"/> 
    <DevMachine Include="B\b.vcproj"/> 
    <DevMachine Include="C\c.vcproj"/> 
    </ItemGroup> 

    <ItemGroup> 
    <BuildMachine Include="D\d.vcproj"/> 
    <BuildMachine Include="E\e.vcproj"/> 
    </ItemGroup> 

    <Target Name="All"> 
    <CallTarget Targets="MakeDevMachine"/> 
    <CallTarget Targets="MakeBuildMachine"/> 
    </Target> 

    <Target Name="MakeDevMachine"> 
    <VCBuild 
     Projects="@(DevMachine)" 
    /> 
    </Target> 

    <Target Name="MakeBuildMachine"> 
    <VCBuild 
     Projects="@(BuildMachine)" 
    /> 
    </Target> 

</Project> 

Sólo la retirada es que hay que mantenerlo sincronizado con el archivo de solución.

1

Una posible solución es usar devenv /build ConfigurationName file.sln en lugar de MSBuild directamente.

Sin embargo, en su solución, descargando el proyecto no es la solución correcta para empezar. Como han dicho las personas antes que yo, use una configuración separada para la máquina de compilación.

Cuestiones relacionadas