msbuild msbuild-4.0

Crear MSBuild objetivo sin dependencias



msbuild-4.0 (5)

Depende del objetivo que quieras construir.
Si el destino está integrado y tiene dependencias (como "Generar"), no puede eliminar las dependencias.
Si es tu propio objetivo, puedes implementarlo fácilmente:

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

Para CorePublish en el proyecto de computación en la nube de Azure , así como cualquier otro con destinos personalizables DependsOn, puede intentar cambiar el proyecto para modificar la lista predeterminada 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>

¿Hay alguna forma en que pueda decirle a MSBuild 4.0 que construya un objetivo, pero ignore las dependencias? Solo quiero construir ese objetivo en sí, nada más.


Me gustaría reiterar la solución de @ EMP (y no puedo votarle debido a mi mala reputación).

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

En su respuesta, invoca a MSBuild desde un script de MSBuild; Aquí hay un ejemplo de la línea de comando:

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


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

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

En tal caso puedes invocar msbuild como

msbuild bar.proj /p:FooDependsOn=

que establece esa propiedad a nada, y por lo tanto no hay dependencias.


Puede ser posible anular el objetivo incorporado, agregar su propia condición y hacer que su objetivo duplique el original, pero esto puede involucrarse bastante. Si puede rastrear un único objetivo integrado dependiente, esto se puede mantener. A veces, estos objetivos "centrales" consisten en nada más que una lista de DependsOnTargets, e incluso a veces se definen en una propiedad, por lo que anularla y agregar una condición donde faltan es trivial. A veces, aunque necesitas hacer un gran corte y pegado para hacerlo bien.

Básicamente, MSBuild solo mantendrá el último objetivo definido de cualquier nombre dado, así que busque dónde está importando el proyecto el archivo .target que incluye el objetivo que desea anular, luego coloque su propia importación del archivo .target que contiene el reemplazo posterior.

Por ejemplo, agregar una condición al objetivo "CoreBuild" de Microsoft.Common.targets es tan fácil como esto, mientras se mantiene el mismo comportamiento de lo contrario (la condición de destino con la propiedad $ (SkipCoreBuild) a continuación):

<Target Name="CoreBuild" Condition="''$(SkipCoreBuild)'' != ''true''" DependsOnTargets="$(CoreBuildDependsOn)"> <OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent" Condition="''$(RunPostBuildEvent)''==''Always'' or ''$(RunPostBuildEvent)''==''OnOutputUpdated''" /> <OnError ExecuteTargets="_CleanRecordFileWrites" /> </Target>

Colocando lo anterior en su propio archivo de objetivos e importándolo en un proyecto de C # después del estándar ...

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

... anulará la implementación predeterminada que no tiene la condición que necesita para desactivarla selectivamente.

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


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

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