2011-09-15 20 views
6

Me pregunto cómo sincronizar dos carpetas, incluidas las subcarpetas que usan MSBuild.Sincronizar dos carpetas con MSBUILD

Lo que me gusta hacer es

a) para copiar todos los archivos de la carpeta de origen a la carpeta dest que son más recientes o no existen en la carpeta dest

y

b) para eliminar todos los archivos de la carpeta dest que no existe (ya) en la carpeta fuente

a) es bastante fácil con el <Copy> tarea, pero ¿cómo puedo lograr b)?

Ésta es mi fichero de construcción hasta el momento:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    ToolsVersion="4.0" 
    DefaultTargets="Backup"> 
    <PropertyGroup> 
     <SourceFolder>C:\source</SourceFolder> 
     <DestFolder>C:\dest</DestFolder> 
    </PropertyGroup> 
    <ItemGroup> 
     <FilesToCopy Include="$(SourceFolder)\**" /> 
    </ItemGroup> 
    <Target Name="Backup"> 
     <!-- copy all files from the source folder to the dest folder 
      that are newer or don't exist in the dest folder --> 
     <Copy 
      SourceFiles="@(FilesToCopy)" 
      DestinationFiles="@(FilesToCopy->'$(DestFolder)\%(RecursiveDir)%(Filename)%(Extension)')" 
      SkipUnchangedFiles="True" /> 
     <!-- TODO: remove all files from the dest folder 
      that don't exist in the source folder --> 
    </Target> 
</Project> 

Respuesta

4

Usted puede hacerlo con la tarea de GetDistinctItemsMSBuild Extension pack. La idea básica es obtener los elementos distintos entre los archivos del origen y la carpeta de destino.

<Project ToolsVersion="3.5" DefaultTargets="Default" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks" /> 

    <PropertyGroup> 
    <SourceFolder>C:\source</SourceFolder> 
    <DestFolder>C:\dest</DestFolder> 
    </PropertyGroup> 

    <ItemGroup> 
    <FilesToCopy Include="$(SourceFolder)\**" /> 
    </ItemGroup> 

    <Target Name="Backup"> 
    <!-- copy all files from the source folder to the dest folder 
        that are newer or don't exist in the dest folder --> 
    <Copy SourceFiles="@(FilesToCopy)" 
      DestinationFiles="@(FilesToCopy->'$(DestFolder)\%(RecursiveDir)%(Filename)%(Extension)')" 
      SkipUnchangedFiles="True" /> 

    <!-- Remove all files from the dest folder 
      that don't exist in the source folder --> 
    <ItemGroup> 
     <DestFiles Include="$(DestFolder)\**"/> 
    </ItemGroup> 

    <!-- Cannot compare FilesToCopy with DestFiles directly, 
     root folders are different--> 
    <ItemGroup> 
     <SrcFilesLeave Include="%(FilesToCopy.RecursiveDir)%(FilesToCopy.Filename)%(FilesToCopy.Extension)"/> 
     <DestFilesLeave Include="%(DestFiles.RecursiveDir)%(DestFiles.Filename)%(DestFiles.Extension)"/> 
    </ItemGroup> 

    <MSBuild.ExtensionPack.Framework.MsBuildHelper TaskAction="GetDistinctItems" 
                InputItems1="@(SrcFilesLeave)" 
                InputItems2="@(DestFilesLeave)"> 
     <Output TaskParameter="OutputItems" ItemName="Distinct"/> 
    </MSBuild.ExtensionPack.Framework.MsBuildHelper> 

    <Message Text="Distinct %(Distinct.Identity)"/> 
    <Delete Files="$(DestFolder)\%(Distinct.Identity)" /> 
    </Target> 

</Project> 
+1

que funciona bien! Instalé MSBuild-Extensions y agregué '' al buildfile – miasbeck

1

Puede utilizar la utilidad MSDeploy dentro de MSBuild para sincronizar dos carpetas como esto:

<Target Name="SynchronyzeFolders"> 
    <PropertyGroup> 
    <_MSDeploySrc>contentPath=C:\inetpub\Dir1\</_MSDeploySrc> 
    <_MSDeployDest>contentPath=C:\inetpub\Dir2\,computerName='https://$(RemoteComputerName):8172/MSDeploy.axd',userName='$(MSDeployUsername)',password='$(MSDeployPassword)',authtype='$(MSDeployAuth)'</_MSDeployDest> 
    <_MSDeployParameters>-verb:$(MSDeployVerb) -source:$(_MSDeploySrc) -dest:$(_MSDeployDest) $(MSDeployAdditionalParams)</_MSDeployParameters> 
    </PropertyGroup> 

    <Exec Command="msdeploy $(_MSDeployParameters)" 
     CustomErrorRegularExpression="ERROR"/> 

carpetas podría ser ya sea en el mismo o en los diferentes ordenadores. La ruta de la carpeta puede contener una ruta local y de red. Y así. Puede sincronizar sitios web de IIS así como carpetas. Sólo tiene que utilizar diferentes proveedores de MSDeploy: http://technet.microsoft.com/en-us/library/dd569040(v=ws.10).aspx Ayuda para la configuración de la red de despliegue Handler: http://www.iis.net/learn/publish/using-web-deploy/configure-the-web-deployment-handler

2

En caso de que alguien no quiere o no puede instalar el paquete de expansión

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    ToolsVersion="4.0" 
    DefaultTargets="Backup"> 
    <PropertyGroup> 
     <SourceFolder>C:\source</SourceFolder> 
     <DestFolder>C:\dest</DestFolder> 
    </PropertyGroup> 
    <ItemGroup> 
     <FilesToCopy Include="$(SourceFolder)\**" /> 
    </ItemGroup> 
    <Target Name="Backup"> 
     <!-- copy all files from the source folder to the dest folder 
      that are newer or don't exist in the dest folder --> 
     <Copy 
      SourceFiles="@(FilesToCopy)" 
      DestinationFiles="@(FilesToCopy->'$(DestFolder)\%(RecursiveDir)%Filename)%(Extension)')" 
      SkipUnchangedFiles="True"> 
      <Output TaskParameter="CopiedFiles" ItemName="Copied"/> 
     </Copy> 
     <ItemGroup> 
      <OutdatedFiles Include="$(DestFolder)\**" Exclude="@(Copied)"/> 
     </ItemGroup> 
     <Delete Files="@(OutdatedFiles)"/> 
    </Target> 
</Project> 
Cuestiones relacionadas