97

「C:\Projects\MyProject\」にある MyProject.csproj という C# プロジェクトがあります。このプロジェクトの出力ディレクトリにコピーしたいファイルもあります。ただし、ファイルは「C:\MyContentFiles\」の場所にあります。つまり、プロジェクト コーン内にはありません。このディレクトリにはサブディレクトリもあります。ディレクトリの内容は管理されていません。したがって、その下にあるものをすべて含める必要があります。

それらを「コンテンツ」としてプロジェクトに含めると、それらはコピーされますが、ディレクトリ構造は失われます。私はこのようなことをしました:-

<Content Include="..\..\MyContentFiles\**">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

これらのファイル/ディレクトリを、ディレクトリ構造を維持したままプロジェクトの出力ディレクトリに再帰的にコピーするにはどうすればよいですか?

4

7 に答える 7

180

私は@Dmytriiが一方でそれを正しく理解していると信じています-あなたは「リンク」機能を使いたいと思っています。

ただし、ディレクトリ ツリーにリンクできないという彼の主張は部分的にしか正しくありません。これは実際、Visual Studio の GUI を使用してリンクを追加しようとする場合に当てはまりますが、MSBuild はこれをサポートしています。

ディレクトリ構造を維持したい場合は、ノードに%(RecursiveDir)タグを追加するだけです:<link>

<Content Include="..\..\MyContentFiles\**\*.*">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

MSBuild Well-known Item Metadataページでは、アクセスできるメタデータについて詳しく説明しています。

于 2012-08-04T13:05:30.123 に答える
60

ファイルをリンクとして追加する必要があります。

  1. VS でプロジェクトを右クリックします。
  2. 追加 -> 既存のアイテム...
  3. ファイルを見つけます。
  4. それを選択して。
  5. リンクとして追加(ダイアログの [追加] ボタンのドロップダウン)。
  6. ファイルのプロパティを開き、「出力ディレクトリにコピー」を「常にコピー」に設定します。

しかし、ディレクトリツリーに対してはできません。
代わりに、ビルド後のタスクを作成する必要があります。これはあなたを凝視させるサンプルです。

于 2009-08-18T07:41:17.257 に答える
13

以下は、プロジェクトファイルの下部に追加するもので、ビルド後のイベントでディレクトリ構造を維持しているコンテンツファイルをビルドのターゲットディレクトリ$(TargetDirectory)(通常は$(MSBuildProjectDirectory)\bin\Debug)にコピーします。

<ItemGroup>
    <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" />
</ItemGroup>

<Target Name="AfterBuild">
    <Copy 
        SourceFiles="@(ExtraContent)" 
        DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
        SkipUnchangedFiles="true" />
</Target>

これらのファイルをMyContentFilesという名前のディレクトリに配置する必要がある場合は、コピーの前にこれを追加できます。

<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />

と変更

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />
于 2009-08-20T02:47:12.467 に答える
5

おもう

<Content Include="..\..\MyContentFiles\**\*.*">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

そのフォルダーとサブフォルダー内のすべてが必要なので、それで十分です

于 2014-10-21T14:48:34.440 に答える