0

MSBuild ターゲット/xml 構成ファイルを作成しています。

プロジェクトのソース フォルダーにコピーしたい 2 つのフォルダーがあるとします。これらのフォルダー (およびその内容) だけをコピーし、他のフォルダーは無視したいと考えています。

以下の仕様は正しいファイルをコピーしていますが、それらはすべて 1 つのフォルダーにダンプされているだけです。最上位の 2 つのフォルダー (bin と obj) は失われ、それらの内容は 1 つのフォルダーに結合されます。

基本的に、2 つのフォルダーを、それらとその内容とまったく同じように、新しい最上位フォルダーにコピーしたいと考えています。

脚本

<Target Name="Package" DependsOnTargets="Build">
    <Message Text="Copying."></Message>
    <ItemGroup>
        <PackagedFiles Include="$(PipelineFolder)MyFolder\bin\**;
                                $(PipelineFolder)MyFolder\obj\**" />
    </ItemGroup>

    <MakeDir Directories="$(PipelineFolder)CopiedFolder" />
    <Copy SourceFiles="@(PackagedFiles)" DestinationFolder="$(PipelineFolder)CopiedFolder\%(RecursiveDir)%(Filename)%(Extension)" />

</Target>

最上位のフォルダーだけをコピーする最も簡単な方法は何ですか。PackagedFiles のワイルドカードは、これらのフォルダー内のすべてを指していると思います。作業ディレクトリの上のフォルダーからこれを行うことはできません。他のすべてのフォルダー (必要なフォルダー、bin および obj だけでなく) をコピーするためです。

ありがとう。

4

1 に答える 1

1

そのためにバッチ処理を使用できます。最初のターゲットは含めるフォルダーを定義し、2 番目のターゲットは最初にそれらのフォルダーを useDependsOnTargets属性で定義します。このOutputs属性はMSBuild、そのターゲットにバッチ処理を使用するように指示します。

<Project DefaultTargets="CopyPackageFolders" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0">

<Target Name="DefinePackageFolders">
    <ItemGroup>
        <PackageFolders Include="bin"/>
        <PackageFolders Include="obj"/>
    </ItemGroup>
</Target>

<Target Name="CopyPackageFolders" DependsOnTargets="DefinePackageFolders" Outputs="%(PackageFolders.Identity)">
    <Message Text="Copying %(PackageFolders.Identity)" />
    <PropertyGroup>
        <TargetSubFolder>%(PackageFolders.Identity)</TargetSubFolder>
    </PropertyGroup>
    <ItemGroup>
        <Files Include="$(PipelineFolder)MyFolder\%(PackageFolders.Identity)\**" />
    </ItemGroup>
    <MakeDir Directories="$(PipelineFolder)CopiedFolder\%(PackageFolders.Identity)" />
    <Copy SourceFiles="@(Files)" DestinationFiles="$(PipelineFolder)CopiedFolder\$(TargetSubFolder)\%(RecursiveDir)%(Filename)%(Extension)" />
</Target>

</Project>

注:属性%(PackageFolders.Identity)で 2 つの異なる項目グループを使用できないため、別のプロパティにラップする必要がありDestinationFilesます。

次の入力データがあるとします。

C:\PipelineFolder\MyFolder\bin\bin.txt
C:\PipelineFolder\MyFolder\obj\obj.txt

提供されたスクリプトが にあると仮定しましょう。次に、特定のプロパティC:\test.projでスクリプトを呼び出します。PipelineFolder

C:\> msbuild test.proj /p:PipelineFolder=C:\PipelineFolder\

結果のファイル セットは次のようになります。

C:\PipelineFolder\CopiedFolder\bin\bin.txt
C:\PipelineFolder\CopiedFolder\obj\obj.txt
于 2016-02-10T16:54:55.273 に答える