web-dev-qa-db-ja.com

プロジェクトコーンの外部にあるコンテンツファイルを.csprojに含める

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

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

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

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

68
Poulo

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

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

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

43

@ Dmytrii は、それを片手で正しく取得できると信じています-「リンク」機能を使用したい場合。

ただし、ディレクトリツリーにリンクできないと言うとき、彼は部分的に正しいだけです。 Visual StudioのGUIを使用してリンクを追加しようとすると、これは確かに真実ですが、MSBuildはこれをサポートします。

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

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

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

135
Mandark

Mandark と答えると、コンテンツファイルがソリューションに直接追加され、ソリューションエクスプローラーに表示されます。元のディレクトリでファイルが追加または削除されるたびに、Visual Studioはこれを自動的に取得しません。また、ソリューションエクスプローラーでファイルが削除または追加されるたびに、プロジェクトファイルが変更され、すべてのファイルがフォルダーだけでなく個別に含まれます。

これを防ぐには、同じトリックを使用できますが、別のプロジェクトファイルに入れてからインポートします。

プロジェクトファイル(include.projなど)は次のようになります。

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="..\..\MyContentFiles\**">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

独自のプロジェクトファイルで、次の行を追加します

<Import Project="include.proj" />

Visual Studioはこのファイルを混乱させず、ビルド中にファイルをコンテンツとして追加するだけです。元のディレクトリの変更は常に含まれます。ファイルはソリューションエクスプローラーには表示されませんが、出力ディレクトリに含まれます。

ここでこのトリックを取り上げました: http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx

27

プロジェクトファイルの最後に追加する次のものは、ビルド後のイベントのディレクトリ構造を維持したままコンテンツファイルをビルドのターゲットディレクトリ$(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" />
10
Todd

おもう

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

あなたはそのフォルダとサブフォルダ内のすべてが欲しいので、ちょうど十分です

3
Menzi

.NET Coreプロジェクトのフォルダーにファイルを含めるには、

<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

また、アイテムのプロパティ「出力ディレクトリにコピー」は「新しい場合にコピー」になります。
Copy if newer

0
zwcloud

.Net Coreプロジェクトのファイルを無視するには:

<ItemGroup>
 <Content Include="appsettings.local.json">
   <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
 </Content>
</ItemGroup>
0