特定のファイルをディレクトリから自分の/bin/
フォルダーにコピーしたいVS2008があります。ファイル(にあります/common/browserhawk/
)を「出力ディレクトリにコピー」に設定しました。ただし、フォルダ構造もコピーされます。ファイルは次の場所にコピーされます。/bin/common/browserhawk/
これらのファイルをコピーする方法を教えてください/bin/
。正しくコピーするために、これらをWebサイトのルートに保存したくありません。
特定のファイルをディレクトリから自分の/bin/
フォルダーにコピーしたいVS2008があります。ファイル(にあります/common/browserhawk/
)を「出力ディレクトリにコピー」に設定しました。ただし、フォルダ構造もコピーされます。ファイルは次の場所にコピーされます。/bin/common/browserhawk/
これらのファイルをコピーする方法を教えてください/bin/
。正しくコピーするために、これらをWebサイトのルートに保存したくありません。
回答:
ビルド後イベントを追加して、ファイルをコピーできます。
プロジェクトのプロパティの[ビルドイベント]タブに移動し、以下をビルド後のイベントコマンドラインに追加します。
copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"
プロジェクトパスにスペースが含まれている場合は、必ず引用符を含めてください。
xcopy /s /d /y "$(ProjectDir)\stuff" "$(TargetDir)\stuff"
以前の回答にはコメントできないので、ここに解決策を示します。
@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)経由」など)。
AvailableItemName
、VS内でプロジェクトファイルを編集すると、無効な要素であると警告します。警告を無視するだけで、とにかく機能します。
<Target Name="RootOutputCopyTarget" AfterTargets="Build">
... </ Target>
テキストエディタで.csproj / .vbprojを編集する場合、ファイルが出力ディレクトリに配置される場所と、ファイルが出力ディレクトリに付ける名前を制御できます。例えば:
<None Include="content\someContent.txt">
<Link>someContentInOutputDirectory.txt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
これにより、ファイルがに配置content\someContent.txt
されbin\someContentInOutputDirectory.txt
ます。bin
必要に応じて、サブディレクトリを選択することもできます。Link要素に追加するだけです。
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
/D
可能な変更を上書きしないようにするためにも役立ちます。
以下を.csproj / .vbprojファイルに追加します
<Target Name="AfterBuild">
<Copy
DestinationFolder="$(OutputPath)"
SourceFiles="@(RootContent)"
SkipUnchangedFiles="true"
/>
</Target>
次に、ルートフォルダー内の必要なファイルのビルドアクションをRootContentに変更します。
RootContent
、「ビルドアクション」ドロップダウンリストに表示されず、手動で入力すると、Visual Studioから「プロパティ値が無効です」というエラーが発生します。私は何を取りこぼしたか?
私はこれをVS2010、VS2015、VS2017、およびVS2019で使用しました。私はこの解決策を好みます:
<RootContent Include="common\browserhawk\**"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </RootContent>
プロジェクトファイルの先頭に向かって:
<ItemGroup>
<AvailableItemName Include="RootContent">
<!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
<Visible>True</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>
RootContent
つまりCustomContent
、このプロジェクトに追加する特別なコンテンツであり、この特定の方法でコピーする必要があることを示すために、「ハードコード」を意味するように交換します。また、余談ですが、TargetPath=%(RecursiveDir)%(Filename)%(Extension)
指定したCustomContent
ファイルから出力パスにフォルダー構造を再作成する必要がありました。
/common/browserhawk/
する/bin/common/browserhawk/
と、OPが言ったように下のファイルがコピーされませんか?IIRC、私の意図は/common/browserhawk/a.txt
最終的にはあるが/bin/a.txt
、そこからの再帰を許可することだったので、最終的にはに/common/browserhawk/secret/stuff.png
なりました/bin/secret/stuff.png
。
%(RecursiveDirectory)
。IDEで個々のファイルを選択するだけでなく、ワイルドカードを使用して複数のファイルを指定することもできるので、これは本当にすばらしいです。**
ワイルドカードを使用すると、フォルダー構造全体が保持されます。
コンパイルが成功した後にコピーするステップを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>
バッチファイルをビルドしてファイルをコピーし、ビルド後のイベントとして実行できます。