【问题标题】:Copying Visual Studio project file(s) to output directory during build在构建期间将 Visual Studio 项目文件复制到输出目录
【发布时间】:2012-05-31 03:19:15
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这也可以(尽管您不需要 xcopy,copy 可以正常工作),但问题是它需要将文件名硬编码到项目的构建属性中。按照我展示的方式进行操作,让我们分别处理每个文件并使用宏作为文件名。
    • 这取决于您使用的 Visual Studio 版本。这个人特别说VS 2003,我有一个项目,这对我有帮助。 2003 年的设置很糟糕 - 您甚至无法在每个文件的属性上指定任何内容,例如“复制到输出目录”。
    • 如果您希望即使项目是最新的并且不需要构建也能复制文件,请将文件添加到项目中。
    • 不应该只是 $(OutDir) 吗? $(ProjectDir) 已经包含在其中(好吧,除非您修改了输出的位置)。您只想使用输出目录。
    • 应该是 copy /y "$(ProjectDir)my_file.ini" "$(OutDir)"。因为目录路径可能包含空格。
    【解决方案2】:

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

    • “构建操作”和
    • “复制到输出目录”

    将“构建操作”设置为“内容”,然后 - 为“复制到输出目录”设置选择适当的值。

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

    如果上述方法不适合您,请阅读这篇文章“Copy to output directory issue with .inf file”。看看这个然后“Visual Studio: default build action for non-default file-types

    希望有帮助

    【讨论】:

    • VS2003 似乎没有该功能(出于某种原因)。
    • 这适用于某些项目类型,而不是全部。例如,它适用于 C# 类型的项目,但不适用于 C++。
    • @B.K.这是因为 MS Build 任务对于不同的项目类型可能有所不同。你可以玩调整它。从这里开始挖掘social.msdn.microsoft.com/Forums/vstudio/en-US/…
    • @DmitryPavlov 没关系;我只是指出它不会在任何地方都有效。
    • @B.K.当然,任何地方都不起作用。很好,VS 至少允许扩展并完成开发人员可能需要的几乎所有事情。
    【解决方案3】:

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

    我将自定义构建步骤设置如下:

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

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

    它反映在输出窗口中:

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

    【讨论】:

    • 对我来说 vs2015 是 Command Line : copy "%(FullPath)" "$(OutDir)" Description : copy "%(FullPath)" "$(OutDir)" Outputs : %(FileName).%(Extension)
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      扩展 Synetech 的答案。

      在 VS2019 中,在解决方案资源管理器中右键单击要复制的文件,然后选择属性。然后在 General >> Item Type 下更改为 Copy File 然后点击 Apply。
      您现在应该在 Destination 等的 Properties Page 中有 UI 字段。

      【讨论】:

      • 没有“项目类型”,只有“文件类型”和没有“复制文件”选项
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          改进 Synetech 答案:

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

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

          在构建后带有 /d /y 参数的 xcopy 也很有用 - 仅当目标文件日期较旧时才复制。

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 2017-11-04
              • 1970-01-01
              • 1970-01-01
              • 2010-12-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多