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

ssm49v7z  于 2022-11-17  发布在  其他
关注(0)|答案(9)|浏览(327)

当我建置Visual Studio项目时,可可执行会写入项目属性页中指定的输出目录。
我有一个项目,其中包含一些程序使用的额外文件(例如,.ini文件)。
如何配置项目将文件复制到输出目录,以便在程序运行时,在其CWD中有另一个文件的副本?
我检查了该文件的属性页,除了一个将其从构建中排除的选项(已禁用)外,没有任何有用的内容,并且custom-build-tool命令为空(加上它是一个不需要任何处理的纯文本文件)。

nhaq1z21

nhaq1z211#

若要将档案复制到Visual Studio 2003中的输出目录,您可以使用建置葬礼件:
1.右键单击项目-〉属性
1.通用属性-〉生成事件
1.将后期生成事件命令行设置为:

xcopy /y $(ProjectDir)my_file.ini  $(ProjectDir)$(OutDir)
  1. OK,开始构建!
lymnna71

lymnna712#

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

  • “生成操作”和
  • “复制到输出目录”

将“生成操作”设置为“内容,”然后为“复制到输出目录”设置选择适当的值。
具有“生成操作”和“复制到输出目录”设置的文件属性窗口

如果上面的方法对你不起作用,请阅读这篇文章“Copy to output directory issue with .inf file“。然后看看这篇文章“Visual Studio: default build action for non-default file-types

x6h2sr28

x6h2sr283#

当我在文件的属性页中搜索build-action字段时,我有了一个想法:将自定义构建步骤设置为 copy 文件(手动)。这比我想象的要容易。我曾认为这需要使用cmd或其他外部可执行文件(xcopyrobocopy等),但这不是必需的。
我将“自定义生成步骤”设置如下:

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

设置输出字段(正确)是至关重要的,以防止VS总是认为项目是过时的,需要重建(我不确定是否需要用$(OutDir)\作为前缀)。
它在“输出”窗口中的反映如下:

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

kpbpu0084#

对于VS 2017,德米特里·巴甫洛夫发布的命令如下:

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

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

apeeds0o

apeeds0o5#

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

7kqas0il

7kqas0il6#

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

bsxbgnwa7#

您需要额外的$(OutDir)。否则,在重建/清理步骤中,它将丢弃您的源代码。

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

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

vhipe2zx8#

改进Synetech的答案:
在VS 2013 C++项目命令行中:复制%(Identity)$(OutDir)描述:正在复制foobar...输出:%(Identity)它可以工作,但它会导致循环依赖,也就是说,它将在每次您要求增量构建时执行,没有任何计量器已经复制。
若要解决此问题,您可以将该项添加到目标文件夹,将路径更改为$(OutDir),然后将第一个添加项中该项用作Output。缺点-解决方案中存在两个名称相似的项。
在后期生成中也使用带有/d /y参数完整xcopy-仅当目标文件日期较早时才复制

vuv7lop3

vuv7lop39#

您也可以在卸载项目后(右键单击项目〉〉卸载项目)在现有的<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

相关问题