web-dev-qa-db-ja.com

出力ディレクトリにコピーはフォルダー構造をコピーしますが、ファイルのみをコピーします

ディレクトリから特定のファイルを/bin/フォルダーにコピーしたいVS2008があります。ファイル(/common/browserhawk/にあります)を「出力ディレクトリにコピー」に設定しました。ただし、フォルダー構造もコピーされます。ファイルは/bin/common/browserhawk/にコピーされます

これらのファイルを/bin/だけにコピーするにはどうすればよいですか?これらを正しくコピーするために、これらをWebサイトのルートに保存したくありません。

関連質問: Visual Studioはコンパイル後に.dllと.pdbをプロジェクトに追加します

87
Steve Wright

ビルド後イベントを追加して、ファイルをコピーできます。
プロジェクトプロパティの[ビルドイベント]タブに移動し、ビルド後のイベントコマンドラインに次を追加します。

copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"

プロジェクトパスにスペースが含まれている場合は、引用符を必ず含めてください。

59
Bill A.

以前の回答についてコメントできないため、ここに解決策を示します。

@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)」を使用)。

44
shockwave

テキストエディタで.csproj/.vbprojを編集する場合、出力ディレクトリ内のファイルの場所と、出力ディレクトリ内のファイルの名前を制御できます。例えば:

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

これにより、ファイルcontent\someContent.txt into bin\someContentInOutputDirectory.txt。必要に応じて、binのサブディレクトリを選択することもできます。それをLink要素に追加するだけです。

43

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
15
AMissico

次を.csproj/.vbprojファイルに追加します

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

次に、ルートフォルダー内の任意のファイルのビルドアクションをRootContentに変更します。

10
Paul Alexander

これをVS2010とVS2015で使用しました。私はこのソリューションが好きです:

  1. XMLはどのプロジェクトでも再利用可能です
  2. 「RootContent」は、他の「コンテンツ」と同様に、Visual Studio UIでビルドアクションとして選択されます。
  3. 「CopyToOutputDirectory」は、期待どおりに守られます
  4. RootContentはプロジェクトの出力に追加されます:Project-Referencesを介して実行され、「Clean」に従います.
  5. RootContentはワイルドカードで指定でき、再帰的なフォルダー構造を保持します:
    <RootContent Include="common\browserhawk\**">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </RootContent>
    

プロジェクトファイルの先頭へ:

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

この回答から借用

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>

この回答から借用

5
MattGerg

最終的にコンパイルが成功した後にコピーするステップを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>
2
Steve Wright

バッチファイルをビルドしてファイルをコピーし、ビルド後イベントとして実行できます。

1
jvanderh