当我构建Visual Studio项目时,可执行文件会被写入到项目属性页指定的输出目录中。
我有一个项目,其中包含一些额外的文件(例如.ini
文件),这些文件被程序使用。
如何配置该项目以将文件复制到输出目录,以便程序运行时它在其CWD中具有其他文件的副本?
我检查了该文件的属性页面,除了一个将其从构建中排除的选项(已禁用)和自定义构建工具命令为空(而且它是不需要任何处理的纯文本文件)之外,没有任何有用信息。
当我构建Visual Studio项目时,可执行文件会被写入到项目属性页指定的输出目录中。
我有一个项目,其中包含一些额外的文件(例如.ini
文件),这些文件被程序使用。
如何配置该项目以将文件复制到输出目录,以便程序运行时它在其CWD中具有其他文件的副本?
我检查了该文件的属性页面,除了一个将其从构建中排除的选项(已禁用)和自定义构建工具命令为空(而且它是不需要任何处理的纯文本文件)之外,没有任何有用信息。
在 Visual Studio 2003 中将文件复制到输出目录,可以使用 Post-Build 事件:
将 Post-Build 事件命令行设置为:
xcopy /y $(ProjectDir)my_file.ini $(ProjectDir)$(OutDir)
好的,开始构建吧!
请尝试在“解决方案资源管理器”中选择文件。然后,您应该能够在“属性窗口”中看到它的属性(如果未显示,请按F4)。您会发现有两个属性:
将"生成操作"设置为"内容(Content)",然后选择适当的值设置"复制到输出目录"。
带有"生成操作"和"复制到输出目录"设置的文件属性窗口
如果上述方法对您无效,请阅读此帖子“.inf文件的复制到输出目录问题”。然后再查看这个帖子“Visual Studio:非默认文件类型的默认生成操作”。
Command Line : copy $(InputFileName) $(OutDir)
Description : Copying foobar...
Outputs : $(InputFileName)
正确设置输出字段非常重要,可以避免VS始终认为项目已过期并需要重新构建(我不确定是否需要在前面加上$(OutDir)\
)。
在“输出”窗口中会反映出如下内容:
Copying foobar...
1 file(s) copied.
Compiling resources...
Linking...
命令行: copy "%(FullPath)" "$(OutDir)"
描述: copy "%(FullPath)" "$(OutDir)"
输出: %(FileName).%(Extension)
- Fantastory对于 VS 2017,Dmitry Pavlov 发布的命令如下:
xcopy /y "$(ProjectDir)my_file.ini" "$(OutDir)"
如果项目目录中包含空格,引号就非常重要。
对Synetech的回答进行扩展。
在VS2019中,右键单击您要复制的文件,选择“属性”。然后在“常规”>>“项目类型”下更改为“复制文件”,然后点击应用。
现在,在属性页面中应该有目标等UI字段。
如果有人需要帮助,我需要将正在构建的项目的输出dll复制到另一个项目中。
xcopy /y "$(ProjectDir)$(OutDir)$(TargetName)$(TargetExt)"
"C:\Application\MyApplicationName\bin\x86\Debug"
/y = overwrite file if already exists
$(ProjectDir) = location on your machine where the project lives
$(OutDir) = is where your current build setup outputs the build
$(TargetName) = What the project being built is set to be called. Ex: XXX of XXX.dll
$(TargetExt) = the extension of the build Ex: .dll of XXX.dll
"C:/..../x86/Debug" is the location to copy to.
你需要额外的$(OutDir)。否则,在重建/清除步骤中,它将丢弃你的源代码。
CommandLine : copy "$(SolutionDir)last-script.js" "$(TargetDir)Debug"
Outputs : $(TargetDir)Debug\last-script.js
改进Synetech的答案:
在VS 2013 C++项目命令行中:copy %(Identity) $(OutDir)。描述:复制foobar... 输出:%(Identity)。这个方法可以工作,但会导致循环依赖,即每次要求增量构建时都会执行它,无论它是否已经被复制。
为了解决这个问题,您可以将该项添加到目标文件夹中,将路径更改为$(OutDir),并在第一个添加的项中使用它作为输出。缺点是解决方案中有两个名称相似的项。
此外,在postbuild中使用带有/d /y参数的xcopy - 仅在目标文件日期较旧时才进行复制,也是非常有用的。
你也可以在卸载项目后(右键单击项目 >> 卸载项目),将以下内容添加到现有的 <ItemGroup>
标记中:
<Content Include="..\..\Config\db.config">
<Link>Config\db.config</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<SubType>Designer</SubType>
</Content>