在应用程序构建期间自动复制文件以输出

时间:2011-04-25 15:02:17

标签: c++ visual-studio-2010 visual-c++ msbuild

C#项目中的文件有复制到输出目录属性。但是在VC ++项目中却没有。我知道,我可以在VC ++中使用构建事件并写一些类似

的内容
xcopy /y /d %(FullPath) $(OutDir)

有没有办法避免使用CMD(和其他脚本方法)?在这种情况下,msbuild可以做些什么来帮忙吗?

8 个答案:

答案 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元素,您可以添加“包含在项目中”属性。

VS 2015 C Property with Included In Project added

答案 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程序集执行此操作。