当我构建一个 Visual Studio 项目时,可执行文件被写入项目属性页中指定的输出目录。
我有一个项目,其中有一些程序使用的额外文件(例如.ini
文件)。
如何配置项目以将文件复制到输出目录,以便在程序运行时,它的 CWD 中有另一个文件的副本?
我检查了文件的属性页,除了从构建中排除它的选项(已禁用)之外没有其他用处,并且 custom-build-tool 命令为空(加上它是一个纯文本文件不需要任何处理)。
当我构建一个 Visual Studio 项目时,可执行文件被写入项目属性页中指定的输出目录。
我有一个项目,其中有一些程序使用的额外文件(例如.ini
文件)。
如何配置项目以将文件复制到输出目录,以便在程序运行时,它的 CWD 中有另一个文件的副本?
我检查了文件的属性页,除了从构建中排除它的选项(已禁用)之外没有其他用处,并且 custom-build-tool 命令为空(加上它是一个纯文本文件不需要任何处理)。
要将文件复制到 Visual Studio 2003 中的输出目录,您可以使用 Post-Build 事件:
将构建后事件命令行设置为:
xcopy /y $(ProjectDir)my_file.ini $(ProjectDir)$(OutDir)
好的并建立!
请尝试在解决方案资源管理器中选择文件。然后您应该能够在“属性”窗口中看到它的属性(F4如果它不可见,请按)。你会发现有两个属性:
将“构建操作”设置为“内容”,然后 - 为“复制到输出目录”设置选择适当的值。
具有“构建操作”和“复制到输出目录”设置的文件属性窗口
如果上述方法不适合您,请阅读这篇文章“使用 .inf 文件复制到输出目录问题”。然后看看这个“ Visual Studio:非默认文件类型的默认构建操作”
希望有帮助
当我在文件的属性页中搜索构建操作字段时,我有一个想法:设置自定义构建步骤以复制文件(手动)。事实证明这比我想象的要容易。我认为它需要使用cmd
或其他外部可执行文件(xcopy
,robocopy
等),但这不是必需的。
我将自定义构建步骤设置如下:
Command Line : copy $(InputFileName) $(OutDir)
Description : Copying foobar...
Outputs : $(InputFileName)
设置输出字段(正确)对于防止 VS 始终认为项目已过时并需要重建(我不确定是否需要以 为前缀$(OutDir)\
)至关重要。
它反映在“输出”窗口中,如下所示:
Copying foobar...
1 file(s) copied.
Compiling resources...
Linking...
对于 VS 2017,Dmitry Pavlov 发布的命令如下:
xcopy /y "$(ProjectDir)my_file.ini" "$(OutDir)"
如果项目目录的路径中有空格,引号很重要。
扩展 Synetech 的答案。
在 VS2019 中,在解决方案资源管理器中右键单击要复制的文件,然后选择属性。然后在 General >> Item Type 下更改为 Copy File,然后点击 Apply。
您现在应该在目的地等的属性页面中有 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) 描述:Copying foobar... 输出:%(Identity) 有效,但是会导致循环依赖,即每次你要求增量时都会执行建立,没有米它已经被复制了。
要解决此问题,您可以将该项目添加到目标文件夹,将路径更改为 $(OutDir),然后在第一个添加的项目中将其用作输出。缺点 - 两个具有相似名称的项目在解决方案中。
在构建后使用 /d /y 参数的 xcopy 也很有用 - 仅当目标文件日期较旧时才复制。
您还可以在卸载项目后(右键单击项目>>卸载项目)在现有<ItemGroup>
标签中添加以下内容:
<Content Include="..\..\Config\db.config">
<Link>Config\db.config</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<SubType>Designer</SubType>
</Content>
在这种情况下,它会从 2 个文件夹中抓取 db.config 文件,并在创建一个包含 db.config 文件的 Config 文件夹后将其放入输出文件夹(默认为 bin/Debug)