web-dev-qa-db-ja.com

msbuildを使用してすべてのファイルとフォルダーをコピーする

誰かが私が作成しようとしているmsbuildスクリプトを手伝ってくれるかどうか疑問に思っています。 msbuildを使用して、すべてのファイルとサブフォルダーをフォルダーから別のフォルダーにコピーします。

{ProjectName}
      |----->Source
      |----->Tools
              |----->Viewer
                       |-----{about 5 sub dirs}

できるようにする必要があるのは、すべてのファイルとサブフォルダーをツールフォルダーからアプリケーションのデバッグフォルダーにコピーすることです。これは私がこれまでに持っているコードです。

 <ItemGroup>
<Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
 </ItemGroup>

<Target Name="BeforeBuild">
        <Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
  </Target>

ビルドスクリプトは実行されますが、ファイルやフォルダーはコピーされません。

ありがとう

78
Nathan W

私もこれに関するヘルプを探していました。時間がかかりましたが、ここで私がやったことはとてもうまくいきました。

_<Target Name="AfterBuild">
    <ItemGroup>
        <ANTLR Include="..\Data\antlrcs\**\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(ANTLR)" DestinationFolder="$(TargetDir)\%(RecursiveDir)" SkipUnchangedFiles="true" />
</Target>
_

これにより、antlrcsという名前のフォルダーの内容が$(TargetDir)に再帰的にコピーされました。

110
Rodolfo Neuber

問題は、ItemGroupの作成方法とCopyタスクの呼び出し方法にあると思われます。これが理にかなっているかどうかを確認します。

<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <PropertyGroup>
        <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
        <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
    </PropertyGroup>

    <Target Name="BeforeBuild">
        <CreateItem Include="$(YourSourceDirectory)\**\*.*">
            <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
        </CreateItem>

        <Copy SourceFiles="@(YourFilesToCopy)"
                DestinationFiles="@(YourFilesToCopy->'$(YourDestinationDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" />
    </Target>
</Project>
70
brock.holum

私はMSBuildを初めて使用しますが、このような状況にはEXECタスクが便利です。私はプロジェクトで同じ課題に遭遇しましたが、これは私にとってはうまくいき、はるかに簡単になりました。それが良い習慣ではない場合、誰か教えてください。

<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite">
    <Exec Command="xcopy.exe  $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" />
</Target>
35
Denzil Brown
<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <PropertyGroup>
        <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
        <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
    </PropertyGroup>

    <Target Name="BeforeBuild">
        <CreateItem Include="$(YourSourceDirectory)\**\*.*">
            <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
        </CreateItem>

        <Copy SourceFiles="@(YourFilesToCopy)"
                DestinationFiles="$(YourFilesToCopy)\%(RecursiveDir)" />
    </Target>
</Project>

\**\*.*すべてのフォルダーからファイルを取得するのに役立ちます。 RecursiveDirは、すべてのファイルをそれぞれのフォルダーに配置するのに役立ちます...

10
amit thakur

代わりに具体的な宛先ディレクトリを指定しようとしましたか

_DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" ? 
_

私は高度なMSBuild構文にあまり精通していませんが、

_@(Viewer->'$(OutputPath)\\Tools') 
_

私には奇妙に見えます。スクリプトはよさそうなので、問題は$(ApplicationDirectory)および$(OutputPath)の値にある可能性があります

編集:

これは役に立つかもしれないブログ投稿です:

方法:タスクを使用してファイルを再帰的にコピーする

4
aku

これは働いた例です:

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">

   <ItemGroup>
      <MySourceFiles Include="c:\MySourceTree\**\*.*"/>
   </ItemGroup>

   <Target Name="CopyFiles">
      <Copy
        SourceFiles="@(MySourceFiles)"
        DestinationFiles="@(MySourceFiles->'c:\MyDestinationTree\%(RecursiveDir)%(Filename)%(Extension)')"
       />
    </Target>

</Project>

ソース: https://msdn.Microsoft.com/en-us/library/3e54c37h.aspx

2
PBo

これは自分のプロジェクトで使用したコピータスクです。サブフォルダーを含むフォルダーをコピー先に正常にコピーすることができました。

<ItemGroup >
<MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" />
</ItemGroup>

<Target Name="AfterCopy" AfterTargets="WebPublish">
<Copy SourceFiles="@(MyProjectSource)" 
 OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/>

私の場合、プロジェクトの発行フォルダーを別の宛先フォルダーにコピーしました。これはあなたの場合と似ていると思います。

1
nzrytmn

個人的には、SDCタスクライブラリの一部であるCopyFolderを使用しました。

http://sdctasks.codeplex.com/

1
Johan

MSBuildを使用して、あるディレクトリから別のディレクトリにファイルを再帰的にコピーする最良の方法は、パラメーターとしてSourceFilesとDestinationFilesを使用してコピータスクを使用することです。たとえば、すべてのファイルをビルドディレクトリからバックアップディレクトリにコピーするには

<PropertyGroup>
<BuildDirectory Condition="'$(BuildDirectory)' == ''">Build</BuildDirectory>
<BackupDirectory Condition="'$(BackupDiretory)' == ''">Backup</BackupDirectory>
</PropertyGroup>

<ItemGroup>
<AllFiles Include="$(MSBuildProjectDirectory)/$(BuildDirectory)/**/*.*" />
</ItemGroup>

<Target Name="Backup">
<Exec Command="if not exist $(BackupDirectory) md $(BackupDirectory)" />
<Copy SourceFiles="@(AllFiles)" DestinationFiles="@(AllFiles-> 
'$(MSBuildProjectDirectory)/$(BackupDirectory)/%(RecursiveDir)/%(Filename)% 
(Extension)')" />
</Target>

これで、上記の[コピー]コマンドでは、すべてのソースディレクトリが走査され、ファイルが宛先ディレクトリにコピーされます。

0