2009-05-14 11 views
5

En MSBuild puedo usar la tarea Copy para copiar archivos de una ubicación a otra.MSBuild: Copie los archivos (si se han modificado) y luego realice una acción (solo si los archivos se actualizaron)

También puedo usar la propiedad SkipUnchangedFiles para especificar que los archivos no se deben copiar si no han cambiado.

¿Existe un patrón estándar para predicar una acción de seguimiento con la condición de que se copiaron uno o más archivos?

Por ejemplo:

  1. Copiar las secuencias de comandos de implementación actualizadas
  2. ejecutar el archivo por lotes que se ejecuta todos los scripts de implementación, en el orden correcto, si y sólo si una o más de las secuencias de comandos han cambiado

Una complicación adicional es que estoy usando la tarea CreateItem para generar dinámicamente la lista de archivos de entrada:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="CopyAndRun"> 
    <Target Name="CopyAndRun"> 
    <CreateItem Include="In\**\*Test*.txt"> 
     <Output TaskParameter="Include" ItemName="SourceFiles"/> 
    </CreateItem> 
    <Copy SourceFiles="%(SourceFiles.Identity)" DestinationFolder="Out\%(RecursiveDir)" SkipUnchangedFiles="true" /> 
    <!-- Only want to execute this if updated files were copied --> 
    <Message Text="Running..." /> 
    </Target> 
</Project> 

Respuesta

9

Puede lograrlo con incremental building que se proporciona de fábrica con MSBuild.

Sayed Ibrahim Hashimi

Mi libro: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+1

Su libro gobierna el mundo MSBuild !!!!!! ¡Lo amo! – Vaccano

+0

¡Buena idea! Sin embargo, estoy usando CreateItem para generar dinámicamente mi lista de archivos para copiar. ¿Todavía es posible usar la función de construcción incremental en este caso? (He añadido un proyecto de ejemplo a mi pregunta.) –

+1

Sí, esto todavía es posible. Muy fácil en realidad. Cree otro objetivo, es decir, SourceFilesItems, y haga que CopyAndRun dependa de eso. Luego, cuando MSBuild llegue a su CopyAndRun, primero ejecutará los objetivos dependientes y luego comenzará la operación de lotes cuando se ejecute realmente CopyAndRun. Si continúa teniendo problemas, puedo darle un ejemplo concreto. Sayed Ibrahim Hashimi –

Cuestiones relacionadas