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


86

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

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

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

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

回答:


56

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

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

ただし、ディレクトリツリーに対しては実行できません。
代わりに、そのためのビルド後のタスクを作成する必要があります。これはあなたをじっと見つめるサンプルです。


8
この回答で述べられているように、「ディレクトリツリーに対しては実行できません」。ステートメントは真実ではありません。
マンダーク2013年

164

私は信じてい@Dmytriiは、右の一方で、それを取得します-あなたは「リンク」機能を使用したいです。

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

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

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

ページMSBuildのよく知られたアイテムのメタデータには、あなたがアクセスできるメタデータの詳細に入ります。


1
1)共有資産ストアからファイルを削除するとどうなりますか?Solution Dirから削除されるようには見えません2)実行の完了後にVisual Studioに$(SolutionDir)からこれらのファイルを削除させる方法はありますか?それらをそこに残すと、他の開発者を混乱させる可能性があります。
アダム

@Adam以下の私の答えを参照してください
Robin van der Knaap 2014年

9
食料も水もほとんどない荒野で墜落し、交際の必要性が高いので、この答えは役に立ちました。これらの指示に従うことで、かつてここの荒野で私を悩ませていたすべての人間のニーズに取って代わった、完全に機能するAIを構築することができました。マンダークありがとう!
deepelement 2014

1
@Vijayは私の編集を参照してください、あなたは必要です<Content Include="..\..\MyContentFiles\**\*.*">-\*.*パスの終わりにあることに注意してください。
CADはやつ

3
VS2017(15.8.6)の.NETCoreプロジェクトでは機能しません。
zwcloud 2018年

29

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

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

プロジェクトファイル(たとえば、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


1
何らかの理由で、これは.projファイルを使用しては機能しないようでしたが、.csprojファイルを使用して機能させることができました。
StriplingWarrior 2014年

6
<Visible> true </ Visible>をContent要素に追加して、アイテムをソリューションエクスプローラーに表示させることができます。
Michael Baker

鉱山は.projだけで大丈夫だった
Jason Dufair 2016

これは私にはまったく機能しませんでした。リンクされるアイテム自体がビルド前のイベントで生成されたためだと思います。
ポールK

2
VS2017(15.8.6)の.NETCoreプロジェクトでは機能しません。
zwcloud 2018年

11

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

1
変換のタイプはoです。@(ExtraContent)-> '...')は@(ExtraContext-> '...')である必要があります。そうでなければ良い答えです!
alexdej 2010年

@Todd 1)MyContentFilesストアからファイルが削除されるとどうなりますか?Solution Dirから削除されるようには見えません2)実行の完了後にVisual Studioに$(SolutionDir)からこれらのファイルを削除させる方法はありますか?それらをそこに残すと、他の開発者を混乱させる可能性があります。
アダム

これが私が必要としていたものでした。プロジェクトとビルドのプロセスは期待どおりに機能していますが、ファイルはClickOnceアプリケーションで公開されていません。そのためのヒントはありますか?
ゲオルク・W.

4

おもう

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

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


3

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

<!--Just files-->
<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>
<!--Content files-->
<ItemGroup>
  <Content Include="..\..\MyContentFiles\**\*.*" Link="MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

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


-1

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

<ItemGroup>
 <Content Include="appsettings.local.json">
   <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
 </Content>
</ItemGroup>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.