web-dev-qa-db-ja.com

アプリケーションのビルド中にファイルを出力に自動コピー

C#プロジェクトのファイルには出力ディレクトリにコピープロパティがあります。ただし、VC++プロジェクトでは存在しません。 VC++ではBuild eventsを使用して、次のように記述できることを知っています。

xcopy /y /d %(FullPath) $(OutDir)

CMD(およびその他のスクリプト作成方法)の使用を回避する方法はありますか?この場合、msbuildは何か手助けをすることができますか?

55
Loom

使用しているVisual Studioのバージョンによって異なります。 Visual Studio 2008のVC++プロジェクトファイルの形式はMSBuildではないため、PostBuildStepでxcopyを使用することをお勧めします。

Visual Studio 2010のVC++プロジェクトにはMSBuild形式があります。したがって、MSBuildコピータスクの機能があります。

以下にサンプルを示します。

<Copy
    SourceFiles="%(FullPath)"
    DestinationFolder="$(OutDir)"
/>

宛先ディレクトリが存在しない場合は、自動的に作成されます

MSDNコピータスクのリファレンスは here です

13
Anton K

この場合、MSBuildは何か手助けをすることができますか?

MSVC 2012を使用して、これは私のために働いた:

C++プロジェクトに「Data/ThisIsData.txt」というファイルがあると仮定します。

プロジェクトをアンロードします(右クリック->プロジェクトのアンロード)。
プロジェクトXMLの編集(右クリック-> .vcxprojの編集)
これで、プロジェクトのMSBuildファイルがXMLとしてエディターに表示されます。

「ThisIsData.txt」を見つけます。次のようになります。

<ItemGroup>
<None Include="Data\ThisIsData.txt" />
...
</ItemGroup>

次に、次のような他のアイテムグループを追加します。

<ItemGroup>
<Content Include="Data\ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...
</ItemGroup>

プロジェクトをリロードしてビルドします。
「ThisIsData.txt」ファイルは、$(OutDir)\ Data\ThisIsData.txtにコピーされます。

ItemGroupを複製する理由

ただ、None includeをcontent includeに変更すると、IDEはもう気に入らないようで、表示されません。データファイルのクイック編集オプションを保持するには、重複したエントリを保持することにしました。

92
jochen

VS 2015では、CプロジェクトにC#の機能を提供できます。 (jochenの答えから構築することからのアイデア。)別のItemGroupを追加する代わりに、指定されたitemgroupを変更してCopyTo要素を追加します。 I.Eは、彼の例を使用して、元のエントリを次のように単純に拡張します。

<ItemGroup>
  <None Include="Data\ThisIsData.txt" />
    <DeploymentContent>true</DeploymentContent>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
...
</ItemGroup>

他のItemGroupは必要ありません。 CopyTo要素を追加することにより、「Included In Project」プロパティを追加します。

VS 2015 C Property with Included In Project added

17
Henri Socha

henri-socha's answer VS2015(およびおそらくVS2013とVS2012、またはMSBuildスタイルのプロジェクトを使用するもの)については、ItemGroupアイテムタイプが重要です。

特に_<Text>_アイテムはコピーされないように見えますが、_<Content>_アイテムはコピーされます。

したがって、プロジェクトディレクトリの場合Dataテキストファイルを含むThisIsData.txtの場合、サブディレクトリが作成されますDataの下に$(OutDir)ディレクトリをコピーし、ファイルをコピーしますThisIsData.txt新しい場合は、プロジェクトからプロジェクトにコピーします。

_<ItemGroup>
  <Content Include="Data\ThisIsData.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>
_

これはできませんが、テキストファイルをプロジェクトに追加し、ContentプロパティをTrueに設定すると、Visual Studio IDEが挿入します。

_<ItemGroup>
  <Text Include="Data\ThisIsData.txt">
    <DeploymentContent>true</DeploymentContent>
  </Text>
</ItemGroup>
_

つまり、IDEを使用してファイルを追加して、ファイルがプロジェクトに含まれていることを確認する(_<Text>_タグItemGroupを追加)してから、プロジェクトを開く必要がありますテキストエディターで、_<Content>_タグItemGroupを追加して、目的の処理を実行します。

_<DeploymentContent>_タグが実際に何をするのかわかりません。私が見つけることができる唯一のMSDNリファレンスはアーカイブされていると考えているため、それは残骸かもしれません: https://msdn.Microsoft.com/en-us/library/aa712517.aspx

5
WaffleSouffle

Visual Studio 2017では、IDEでこれを行うことができます。以前のバージョンについてはわかりません。

ファイルをインクルードプロジェクトファイルとして追加するだけで、ソリューションエクスプローラーに表示されます。次に、ファイルを右クリックして、[プロパティ]メニューを選択します。

コンテンツを「はい」に変更し、アイテムタイプを「ファイルをコピー」に変更します

プロジェクトファイルに加えられた変更を見ると、次のように追加されていることがわかります。

<ItemGroup>
  <CopyFileToFolders Include="Filename.txt">
    <DeploymentContent>true</DeploymentContent>
    <FileType>Document</FileType>
  </CopyFileToFolders>
</ItemGroup>
1
Eric

Visual Studio 2019では、ファイルを「プロジェクトに含める」として設定した後、プロパティを編集し、アイテムタイプ「ファイルをコピー」として選択することができます( https://i.stack.imgur.com/vac2b png )これにより、手動のvcxprojファイルエディションが回避されます。

1
Jacq

別の質問で Jeff Gが答えました としてプロジェクトファイルにコピーを指定できます。

の中に *.vcxprojファイル、変更:

<Text Include="Filename.txt" />

に:

<Content Include="Filename.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

次に、*.vcxproj.filtersファイル、変更:

<Text Include="Filename.txt">
    <Filter>Resource Files</Filter>
</Text>

に:

<Content Include="Filename.txt">
    <Filter>Resource Files</Filter>
</Content>

どこ <Text ...>タグは、指定されたテキストファイル用です(<Image ...>画像ファイルなど)

1
kjhf