复制到输出目录复制文件夹结构,但只想复制文件

Ste*_*ght 87 msbuild visual-studio-2008

我有一个VS2008我想将目录中的某些文件复制到我的/bin/文件夹中.我已将文件(位于/common/browserhawk/)设置为"复制到输出目录".但是,它也会复制文件夹结构:文件被复制到/bin/common/browserhawk/

如何将这些文件复制到只是/bin/?我不想将它们存储在网站的根目录中以使它们正确复制.

相关问题:Visual Studio在编译后将.dll和.pdb添加到项目中

小智 58

您可以添加Post Build Event来复制文件.
转到项目属性,"构建事件"选项卡,并将以下内容添加到Post-build事件命令行:

copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"
Run Code Online (Sandbox Code Playgroud)

如果项目路径中包含空格,请务必包含引号.

  • 在我的情况下我稍微修改了这个:`xcopy/s/d/y"$(ProjectDir)\ stuff""$(TargetDir)\ stuff"` (2认同)

sho*_*ave 44

由于我无法评论以前的答案,我将把解决方案放在这里:

添加@PaulAlexander提供的内容,将以下内容添加到.csproj/.vbproj文件中:

<ItemGroup>
    <AvailableItemName Include="RootContent">
      <Visible>false</Visible>
    </AvailableItemName>  
</ItemGroup>
<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>
Run Code Online (Sandbox Code Playgroud)

这允许您在"属性"窗口中选择"RootContent"作为"构建操作",并且可以通过GUI访问所有内容.更完整的解释:"AvailableItemName"选项基本上创建了一个新的命名列表,您可以将项目中的项目分配到"属性"窗口中的"构建操作"属性下.然后,您可以在任何您喜欢的目标中使用这个新创建的列表(例如,通过"@(RootContent)").

  • 可惜,这只是将文件复制到项目的输出目录中的文件属于 - 在启动项目的输出目录,而不是.在库项目中使用它时,这很重要. (2认同)
  • 这对于使用vs2008在发布和调试模式下构建非常有用,但在使用单击发布时它似乎不起作用.有什么建议? (2认同)
  • 在 vs2015 中对我不起作用。通过稍微重写目标来修复:`&lt;Target Name="RootOutputCopyTarget" AfterTargets="Build"&gt;` ... &lt;/Target&gt; (2认同)

Dan*_*sky 43

如果在文本编辑器中编辑.csproj/.vbproj,则可以控制文件在输出目录中的放置位置,以及文件在输出目录中的名称.例如:

<None Include="content\someContent.txt">
  <Link>someContentInOutputDirectory.txt</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
Run Code Online (Sandbox Code Playgroud)

这将把文件content\someContent.txt放入bin\someContentInOutputDirectory.txt.bin如果需要,您也可以选择一个子目录; 只需将其添加到Link元素即可.

  • 这是迄今为止最好的解决方案 (5认同)
  • 哇,我现在很幸运需要这个而不是两天前.谢谢; 这很棒! (3认同)
  • 这应该被设置为正确的答案 (3认同)
  • 天啊,谢谢你.我花了6个小时试图修复一些角落垃圾,而VS并没有以智能的方式复制.dll.这是生命,宇宙和一切的真正答案. (2认同)

AMi*_*ico 15

我相信XCOPY命令可以更好地处理目录和文件.因此,

    XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y
Run Code Online (Sandbox Code Playgroud)

这允许从目标目录创建文件夹.

    XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y
Run Code Online (Sandbox Code Playgroud)

Project文件夹/文件结构:

    A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES
    ????NewFolder1
    ????NewFolder2
    ?       TextFile1.txt
    ?       TextFile2.txt
    ????NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt
Run Code Online (Sandbox Code Playgroud)

变为:

    A:\TEMP\CONSOLEAPPLICATION3\BIN\DEBUG
    ?   ConsoleApplication3.exe
    ?   ConsoleApplication3.pdb
    ?   ConsoleApplication3.vshost.exe
    ?   ConsoleApplication3.vshost.exe.manifest
    ????NewFolder1
    ????NewFolder2
    ?       TextFile1.txt
    ?       TextFile2.txt
    ?
    ????NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt
Run Code Online (Sandbox Code Playgroud)


Pau*_*der 10

将以下内容添加到.csproj/.vbproj文件中

<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>
Run Code Online (Sandbox Code Playgroud)

然后将根文件夹中所需的任何文件的Build Action更改为RootContent.

  • 谢谢,这看起来很有用.不幸的是,即使将片段添加到.vbproj文件后,"RootContent"也没有显示在"Build Action"下拉列表中并手动输入,导致Visual Studio中出现"属性值无效"错误.我错过了什么? (2认同)

Mat*_*erg 5

我在VS2010和VS2015中使用过它.我更喜欢这个解决方案因为

  1. XML可以在任何项目中重用
  2. "RootContent"在Visual Studio UI中被选为Build Action,就像任何其他"内容"一样
  3. 正如您所料,遵守"CopyToOutputDirectory"
  4. RootContent被添加到项目的输出中:通过Project-References传递,服从"Clean"等.
  5. 可以使用通配符指定RootContent,保留递归文件夹结构:
    <RootContent Include="common\browserhawk\**">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </RootContent>
    
    Run Code Online (Sandbox Code Playgroud)

到项目文件的开头:

  <ItemGroup>
    <AvailableItemName Include="RootContent">
      <!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
      <Visible>False</Visible>
    </AvailableItemName>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

借用这个答案

在Microsoft .targets导入之后:

  <PropertyGroup>
    <AssignTargetPathsDependsOn>
      $(AssignTargetPathsDependsOn);
      IncludeRootContentAsContent;
    </AssignTargetPathsDependsOn>
  </PropertyGroup>
  <Target Name="IncludeRootContentAsContent">
    <CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
      <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
    </CreateItem>
  </Target>
Run Code Online (Sandbox Code Playgroud)

借用这个答案