C#プロジェクトのファイルには出力ディレクトリにコピープロパティがあります。ただし、VC++プロジェクトでは存在しません。 VC++ではBuild eventsを使用して、次のように記述できることを知っています。
xcopy /y /d %(FullPath) $(OutDir)
CMD(およびその他のスクリプト作成方法)の使用を回避する方法はありますか?この場合、msbuildは何か手助けをすることができますか?
使用しているVisual Studioのバージョンによって異なります。 Visual Studio 2008のVC++プロジェクトファイルの形式はMSBuildではないため、PostBuildStepでxcopyを使用することをお勧めします。
Visual Studio 2010のVC++プロジェクトにはMSBuild形式があります。したがって、MSBuildコピータスクの機能があります。
以下にサンプルを示します。
<Copy
SourceFiles="%(FullPath)"
DestinationFolder="$(OutDir)"
/>
宛先ディレクトリが存在しない場合は、自動的に作成されます
MSDNコピータスクのリファレンスは here です
この場合、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はもう気に入らないようで、表示されません。データファイルのクイック編集オプションを保持するには、重複したエントリを保持することにしました。
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」プロパティを追加します。
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
Visual Studio 2017では、IDEでこれを行うことができます。以前のバージョンについてはわかりません。
ファイルをインクルードプロジェクトファイルとして追加するだけで、ソリューションエクスプローラーに表示されます。次に、ファイルを右クリックして、[プロパティ]メニューを選択します。
コンテンツを「はい」に変更し、アイテムタイプを「ファイルをコピー」に変更します
プロジェクトファイルに加えられた変更を見ると、次のように追加されていることがわかります。
<ItemGroup>
<CopyFileToFolders Include="Filename.txt">
<DeploymentContent>true</DeploymentContent>
<FileType>Document</FileType>
</CopyFileToFolders>
</ItemGroup>
Visual Studio 2019では、ファイルを「プロジェクトに含める」として設定した後、プロパティを編集し、アイテムタイプ「ファイルをコピー」として選択することができます( https://i.stack.imgur.com/vac2b png )これにより、手動のvcxprojファイルエディションが回避されます。
別の質問で 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 ...>
画像ファイルなど)