2011-09-15 27 views
6

MSBuildを使用してサブフォルダを含む2つのフォルダを同期させる方法を知りたい。私がやりたい何MSBUILDを使用して2つのフォルダを同期する

A) 新しいですかDESTフォルダに存在しないことをdestフォルダにソースフォルダからすべてのファイルをコピーすることです

b) ソースフォルダ内に存在しないdestフォルダからすべてのファイルを削除するには

a)を使用するとかなり簡単ですタスクですが、どのようにb)を達成できますか?

これは、これまでのところ、私のビルドファイルです:

<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> 

答えて

4

あなたはMSBuild Extension packからGetDistinctItemsタスクでそれを行うことができます。 基本的な考え方は、ソースフォルダと宛先フォルダからファイル間の別個のアイテムを取得することです。

<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

をインストールすることはできません!私はMSBuild-Extensionsをインストールし、 ''をビルドファイルに追加しました – miasbeck

1

あなたはこのように2つのフォルダを同期するためにMSBuildの内場合msdeployユーティリティを使用することができます。

<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"/> 

フォルダは、同じまたは異なるコンピュータ上のいずれかである可能性があります。フォルダのパスには、ローカルパスとネットワークパスを含めることができます。等々。 IIS WebSitesとフォルダを同期させることができます。ただ、異なる場合msdeployプロバイダを使用:Web配置ハンドラーを設定するためのhttp://technet.microsoft.com/en-us/library/dd569040(v=ws.10).aspx ヘルプ:http://www.iis.net/learn/publish/using-web-deploy/configure-the-web-deployment-handler

2

場合、誰かが望んでいないか、うまく機能拡張パック

<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> 
関連する問題