在构建期间将Visual Studio项目文件复制到输出目录

时间:2012-05-31 03:19:15

标签: visual-studio build projects-and-solutions visual-studio-2003

当我构建Visual Studio项目时,可执行文件将写入项目属性页中指定的输出目录。

我有一个项目,其中包含一些程序使用的额外文件(例如.ini文件)。

如何配置项目以将文件复制到输出目录,以便在程序运行时,它的CWD中有另一个文件的副本?

我检查了文件的属性页,除了从构建中排除它(禁用)的选项之外没有任何其他用处,并且custom-build-tool命令为空(加上它是纯文本)不需要任何处理的文件。)

8 个答案:

答案 0 :(得分:34)

要将文件复制到Visual Studio 2003中的输出目录,您可以使用Post-Build事件:

  1. 右键单击项目 - >属性
  2. 公共属性 - >构建事件
  3. 将构建后事件命令行设置为:

    xcopy /y $(ProjectDir)my_file.ini  $(ProjectDir)$(OutDir)
    
  4. 确定并构建!

答案 1 :(得分:25)

请尝试在解决方案资源管理器中选择该文件。然后你应该能够在属性窗口中看到它的属性(如果它不可见,按 F4 )。你会发现有两个属性:

  • “构建行动”和
  • “复制到输出目录”

将“Build Action”设置为“Content”,然后 - 为“Copy to Output Directory”设置选择合适的值。

带有“构建操作”和“复制到输出目录”设置的文件属性窗口

File properties window with "Build Action" and "Copy to Output Directory" settings

如果以上方式不适合您,请阅读此帖“Copy to output directory issue with .inf file”。然后看一下这个“Visual Studio: default build action for non-default file-types

希望有所帮助

答案 2 :(得分:5)

当我在文件的Property Page中搜索构建操作字段时,我想到了:将自定义构建步骤设置为 copy 文件(手动)。事实证明这比我想象的要容易。我认为需要使用cmd或其他外部可执行文件(xcopyrobocopy等),但这不是必需的。

我按如下方式设置自定义构建步骤:

Command Line : copy $(InputFileName) $(OutDir)
Description  : Copying foobar...
Outputs      : $(InputFileName)

设置输出字段(正确)是至关重要的,以防止VS始终认为项目已过期并需要重建(我不确定它是否需要以$(OutDir)\为前缀)

它反映在输出窗口中:

Copying foobar...
        1 file(s) copied.
Compiling resources...
Linking...

答案 3 :(得分:2)

对于VS 2017,Dmitry Pavlov发布的命令如下:

xcopy /y "$(ProjectDir)my_file.ini"  "$(OutDir)"

如果项目目录的路径中有空格,则引号很重要。

答案 4 :(得分:1)

万一这对任何人都有帮助,我需要将我正在构建的项目的输出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.

答案 5 :(得分:1)

扩展Synetech的答案。

在VS2019中,在解决方案资源管理器中右键单击要复制的文件,然后选择“属性”。然后在“常规>>项类型”下更改为“复制文件”,然后单击“应用”。
现在,您应该在“属性”页面中的“目标”等位置具有UI字段。

答案 6 :(得分:0)

你需要额外的$(OutDir)。否则,在重建/清理步骤中,它会丢弃你的来源。

CommandLine : copy "$(SolutionDir)last-script.js" "$(TargetDir)Debug"

Outputs  : $(TargetDir)Debug\last-script.js

答案 7 :(得分:0)

改善Synetech 回答:

在VS 2013 C ++项目命令行中:copy%(Identity)$(OutDir)描述:复制foobar ...输出:%(Identity) 它可以工作,但它会导致循环依赖,即每次你需要增量构建时都会执行,没有已经复制的仪表。

要解决此问题,您可以在目标文件夹中添加该项目,将路径更改为$(OutDir),并在第一个添加的项目中将其用作输出。缺点 - 两个名称相似的项目正在解决之中。

在postbuild中使用带有/ d / y参数的xcopy也很有用 - 仅在目标文件日期较旧时复制。