C#项目中的文件有复制到输出目录属性。但是在VC ++项目中却没有。我知道,我可以在VC ++中使用构建事件并写一些类似
的内容xcopy /y /d %(FullPath) $(OutDir)
有没有办法避免使用CMD(和其他脚本方法)?在这种情况下,msbuild可以做些什么来帮忙吗?
答案 0 :(得分:90)
在这种情况下,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更改为内容包含,那么IDE似乎不再喜欢它,并且不会显示它。因此,为了保持我的数据文件的快速编辑选项,我决定保留重复的条目。
答案 1 :(得分:17)
在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元素,您可以添加“包含在项目中”属性。
答案 2 :(得分:12)
这取决于您使用的Visual Studio版本。 Visual Studio 2008中VC ++项目文件的格式不是MSBuild,因此在PostBuildStep中使用xcopy是一个不错的选择。
Visual Studio 2010中的VC ++项目具有MSBuild格式。因此,有MSBuild Copy任务的功能。
以下是一个示例:
<Copy
SourceFiles="%(FullPath)"
DestinationFolder="$(OutDir)"
/>
如果目标目录不存在,则会自动创建
MSDN复制任务参考为here
答案 3 :(得分:5)
关于VS2015(可能是VS2013和VS2012,或任何使用MSBuild样式项目的任何内容)的henri-socha's answer之后,ItemGroup项类型很重要。
特别是<Text>
项目似乎没有被复制,而<Content>
项目则被复制。
因此,对于包含文本文件 ThisIsData.txt 的项目目录 Data ,这将在{{1]下创建一个子目录 Data 目录并将文件 ThisIsData.txt 从项目复制到其中,如果它更新的话:
$(OutDir)
虽然如果将文本文件添加到项目中,Visual Studio IDE将插入,并将<ItemGroup>
<Content Include="Data\ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
属性设置为Content
,
这不会。
True
所以换句话说,您需要通过IDE添加文件,使其实现文件包含在项目中(添加<ItemGroup>
<Text Include="Data\ThisIsData.txt">
<DeploymentContent>true</DeploymentContent>
</Text>
</ItemGroup>
标签ItemGroup),然后在文本编辑器中打开项目并添加<Text>
标签ItemGroup让它做你想做的事。
我不确定<Content>
标签究竟是做什么的。它可能是一个残余,因为我能找到的唯一MSDN参考认为它已归档:https://msdn.microsoft.com/en-us/library/aa712517.aspx
答案 4 :(得分:1)
您可以在另一个问题中将项目文件中的复制指定为Jeff G answered:
在
*.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 ...>
。)
答案 5 :(得分:1)
在Visual Studio 2017中,您可以在IDE中执行此操作。我不确定较早的版本。
只需将文件添加为包含的项目文件,即可在解决方案资源管理器中显示。然后右键单击该文件,然后选择“属性”菜单。
将“内容”更改为“是”,并将项目类型更改为“复制文件”
如果您查看它对项目文件所做的更改,您会发现它添加了以下内容:
<ItemGroup>
<CopyFileToFolders Include="Filename.txt">
<DeploymentContent>true</DeploymentContent>
<FileType>Document</FileType>
</CopyFileToFolders>
</ItemGroup>
答案 6 :(得分:0)
在Visual Studio 2019中,将文件设置为“包含在项目中”后,您可以编辑属性,然后选择作为项目类型“复制文件”(如https://i.stack.imgur.com/vac2b.png中所示) 这样就避免了手动vcxproj文件版本。
答案 7 :(得分:-4)
如果它是COM dll,您可以将其添加到项目的根目录,将其标记为“内容”并将复制到输出目录设置为“始终”。我必须为签名捕获COM程序集执行此操作。