2011-02-28 17 views

Respuesta

36

me gustaría reiterar @ solución de EMP (y no lo puedo votar debido a mi reputación insignificante).

La forma correcta de evitar el comportamiento predeterminado de MSBuild de reconstruir todas las dependencias enumeradas en el archivo de proyecto es establecer la propiedad BuildProjectReferences en false.

En su respuesta, invoca MSBuild desde dentro de una secuencia de comandos de MSBuild; aquí hay un ejemplo de la línea de comandos:

MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build 
1

Depende del objetivo que desea construir.
Si el destino está incorporado y tiene dependencias (como "Crear"), no puede eliminar dependencias.
Si es su propio objetivo se puede implementar fácilmente:

<Target Name="YourTargetWithDependencies" 
     DependsOnTargets="YourTargetDependencies;YourTarget"> 
</Target> 

<Target Name="YourTarget" > 
</Target> 

Para CorePublish en proyecto de computación Azure nube, así como cualquier otra de las metas DependsOn personalizables se puede tratar de cambiar el proyecto para modificar por defecto lista de dependencias:

<Target Name=CallPublish> 
     <!-- Modified list of dependencies. Build is skipped here. --> 
     <PropertyGroup> 
     <CustomCorePublishDependsOn> 
      PrepareForPackaging; 
      CheckRoleInstanceCount; 
      CopyServiceDefinitionAndConfiguration; 
      ConfigureWebDeploy; 
      IntelliTrace; 
     </CustomCorePublishDependsOn> 
     </PropertyGroup> 

     <MSBuild Projects="$(MSBuildProjectFullPath)" 
       Targets="CorePublish" 
       Properties="CorePublishDependsOn=$(CustomCorePublishDependsOn);Configuration=$(Configuration);Platform=$(Platform)"> 
</Target> 
+0

Sí, está integrado, por supuesto. – EMP

+0

@Evgeny, ¿puedes especificarlo? –

+0

Es el objetivo de CorePublish en un proyecto .ccproj. Por supuesto, puedo hacer lo que hace internamente de forma manual, solo me preguntaba si hay una mejor manera. – EMP

1

Por lo general, las dependencias de un destino se especifican con una propiedad, por ejemplo:

<Target Name="Foo" DependsOnTargets="$(FooDependsOn)">..</Target> 

En tal caso puede invocar msbuild como

msbuild bar.proj /p:FooDependsOn= 

que establece que la propiedad de nada, y así que no hay dependencias.

3

Es posible anular el objetivo incorporado, agregar su propia condición y hacer que su destino duplique el original, pero esto puede complicarse bastante. Si puede rastrear un solo objetivo integrado dependiente, esto puede mantenerse. A veces, estos objetivos "centrales" consisten en nada más que una lista de DependsOnTargets, y en ocasiones incluso se definen en una propiedad, por lo que anularla y agregar una condición en la que faltan es trivial. A veces, aunque necesitas hacer un gran corte y pegar para hacerlo bien.

Básicamente, MSBuild solo mantendrá el último destino definido de cualquier nombre dado, así que encuentre dónde su proyecto está importando el archivo .target que incluye el objetivo que desea sobrescribir, luego coloque su propio archivo .target que contiene la importación anular después de eso.

Por ejemplo, la adición de una condición a la meta "CoreBuild" de Microsoft.Common.targets es tan fácil como esto, mientras se mantiene el mismo comportamiento en caso contrario (la condición de destino con la $ (SkipCoreBuild) del siguiente listado):

<Target 
    Name="CoreBuild" 
    Condition="'$(SkipCoreBuild)' != 'true'" 
    DependsOnTargets="$(CoreBuildDependsOn)"> 

    <OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent" 
     Condition="'$(RunPostBuildEvent)'=='Always' or 
      '$(RunPostBuildEvent)'=='OnOutputUpdated'" 
     /> 
    <OnError ExecuteTargets="_CleanRecordFileWrites" /> 
</Target> 

Colocación de la anterior en su propio archivo de objetivos y la importación en un proyecto de C# después de la norma ...

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 

... va a sustituir la implementación predeterminada que no tenga la condición que necesita para deshabilitarlo selectivamente.

En cualquier caso, si encuentra un objetivo que no le permite modificar la condición, me gustaría presentar un error en Connect que describe lo que está tratando de hacer, la gente de MSBuild puede ser muy sensible a este tipo de cosa (con el tiempo).

13

Resulta que el objetivo incorporado Build comprueba una propiedad llamada BuildProjectReferences para saber si se deben construir referencias o no. Necesito ejecutar Build en el proyecto mismo (de lo contrario, no funciona), simplemente no en sus dependencias.Terminé llamando:

<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" /> 
Cuestiones relacionadas