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

时间:2009-06-18 17:51:45

标签: visual-studio-2008 msbuild

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

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

相关问题:Visual Studio adds .dll and .pdb to project after compiling

8 个答案:

答案 0 :(得分:59)

答案 1 :(得分:44)

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

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

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

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

答案 2 :(得分:43)

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

<None Include="content\someContent.txt">
  <Link>someContentInOutputDirectory.txt</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

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

答案 3 :(得分:15)

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

    XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y

允许从目标目录创建文件夹。

    XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y

项目文件夹/文件结构:

    A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES
    ├───NewFolder1
    ├───NewFolder2
    │       TextFile1.txt
    │       TextFile2.txt
    └───NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt

变为:

    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

答案 4 :(得分:10)

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

<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>

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

答案 5 :(得分:5)

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

  1. XML可以在任何项目中重复使用
  2. “RootContent”在Visual Studio UI中被选为Build Action,就像任何其他“Content”一样
  3. 遵循“CopyToOutputDirectory”,正如您所期望的那样
  4. RootContent被添加到项目的输出中:通过Project-References传递,服从“Clean”等。
  5. 可以使用通配符指定RootContent,保留递归文件夹结构:
    <RootContent Include="common\browserhawk\**">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </RootContent>
    
  6. 走向项目文件的开头:

      <ItemGroup>
        <AvailableItemName Include="RootContent">
          <!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
          <Visible>False</Visible>
        </AvailableItemName>
      </ItemGroup>
    

    Borrowed From This Answer

    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>
    

    Borrowed From This Answer

答案 6 :(得分:2)

我最后在nant构建文件中添加了一个步骤,以便在成功完成后进行复制

<target name="action.copy.browserhawk.config" depends="compile.source">
    <copy todir="${App.Web.dir}/bin/" includeemptydirs="false">
        <fileset basedir="${browserhawk.config.dir}">
            <include name="bhawk_bb.dat" />
            <include name="bhawk_sp.dat" />
            <include name="browserhawk.properties" />
            <include name="maindefs.bdd" />
            <include name="maindefs.bdf" />
            <include name="BH_PRO.lic" />
        </fileset>
    </copy>
    <echo message="COPY BROWSERHAWK CONFIG: SUCCESS   ${datetime::now()}" />
</target>

答案 7 :(得分:1)

您可以构建一个批处理文件来复制文件并将其作为构建后事件执行。