16

MSBuild を使用してテキスト ファイルからファイルのリストを読み取り、再帰コピーを実行して、これらのディレクトリ ファイルの内容をステージング領域にコピーし、特定の拡張子(.tmp ファイルなど)を除外しようとしています。

CreateItem と MSBuild コピー タスクを使用して、上記のほとんどを非常に簡単に行うことができました。何をしても、CreateItem タスクは Exclude パラメーターを無視します。

<PropertyGroup>
  <RootFolder>c:\temp</RootFolder>
  <ExcludeFilter>*.tmp</ExcludeFilter>
  <StagingDirectory>staging</StagingDirectory>
</PropertyGroup>
<ItemGroup>
  <InputFile Include="MyFile.txt" />
</ItemGroup>

<Target Name="Build">
  <ReadLinesFromFile File="@(InputFile)">
    <Output ItemName="AllFolders" TaskParameter="Lines" />
  </ReadLinesFromFile>

  <CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**"
              Exclude="$(ExcludeFilter)">
    <Output ItemName="AllFiles" TaskParameter="Include" />
  </CreateItem>

  <Copy SourceFiles="@(AllFiles)"
        DestinationFolder="$(StagingDirectory)\%(RecursiveDir)" 

「MyFile.txt」の内容例:

somedirectory\
someotherdirectory\

(つまり、パスは相対的です$(RootFolder)-関連する可能性があることをどこかで読んだので、これに言及してください)

Exclude フィルターのさまざまな組み合わせを試してみましたが、.tmp ファイルを正しく除外できないようです。xcopy に頼らずに MSBuild でこれを行う方法はありますか?

4

1 に答える 1

28

絶対パスで指定しExclude、除外ワイルドカードを変更してサブディレクトリを含める必要があります

に絶対パスを使用する場合は、 にも絶対パスをInclude使用する必要がありますExclude。に相対パスを使用する場合はInclude、両方に相対パスを使用する必要があります。

<PropertyGroup>
  <RootFolder>c:\temp</RootFolder>
  <ExcludeFilter>**\*.tmp</ExcludeFilter>
  <StagingDirectory>staging</StagingDirectory>
</PropertyGroup>
<ItemGroup>
  <InputFile Include="MyFile.txt" />
</ItemGroup>

<Target Name="Build">
  <ReadLinesFromFile File="@(InputFile)">
    <Output ItemName="AllFolders" TaskParameter="Lines" />
  </ReadLinesFromFile>

  <CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**"
              Exclude="$(RootFolder)\%(AllFolders.RelativeDir)$(ExcludeFilter)">
    <Output ItemName="AllFiles" TaskParameter="Include" />
  </CreateItem>

  <Copy SourceFiles="@(AllFiles)"
        DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>

複数の除外と絶対パス

複数のアイテムを除外したい場合、絶対パスを使用している場合はきれいな方法はありませんが、Remove.

最初の方法: Remove と item を使用する

<PropertyGroup>
  <RootFolder>c:\temp</RootFolder>
</PropertyGroup>

<ItemGroup>
  <InputFile Include="MyFile.txt" />
  <!-- Exclude are defined here -->
  <ExcludeFilters Include="$(RootFolder)\**\*.tmp"/>
  <ExcludeFilters Include="$(RootFolder)\**\*.bmp"/>
</ItemGroup>

<Target Name="Build">
  <ReadLinesFromFile File="@(InputFile)">
    <Output ItemName="AllFolders" TaskParameter="Lines" />
  </ReadLinesFromFile>

  <CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**">
    <Output ItemName="AllFiles" TaskParameter="Include" />
  </CreateItem>

  <!-- Removing the wrong extension in item -->
  <ItemGroup>
    <AllFiles Remove="@(ExcludeFilters)"/>
  </ItemGroup>

  <Copy SourceFiles="@(AllFiles)"
        DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>

2番目の方法:削除と条件の使用

<Target Name="Build">
  <ReadLinesFromFile File="@(InputFile)">
    <Output ItemName="AllFolders" TaskParameter="Lines" />
  </ReadLinesFromFile>

  <CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**">
    <Output ItemName="AllFiles" TaskParameter="Include" />
  </CreateItem>

  <!-- Removing the wrong extension in item -->
  <ItemGroup>
    <AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.tmp'"/>
    <AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.bmp'"/>
  </ItemGroup>

  <Copy SourceFiles="@(AllFiles)"
        DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>
于 2010-06-13T07:05:17.813 に答える