だから私の問題はかなり単純です。デバッグビルドであろうとリリース公開であろうと、ビルド出力ディレクトリにコピーしたいファイルがいくつかあります。私が見つけることができるすべての情報は、古いjson構成アプローチに関するものです。dotnetcoreでcsprojを使用した例はありますか?
だから私の問題はかなり単純です。デバッグビルドであろうとリリース公開であろうと、ビルド出力ディレクトリにコピーしたいファイルがいくつかあります。私が見つけることができるすべての情報は、古いjson構成アプローチに関するものです。dotnetcoreでcsprojを使用した例はありますか?
回答:
あなたのニーズが何であるかに応じて、あなたの目標を達成するためのかなりの数の方法があります。
最も簡単な方法は、(メタデータを設定しているCopyToOutputDirectory
/ CopyToPublishDirectory
(仮定条件付き)の項目を.txt
されNone
た項目の代わりに、Content
それは仕事をしない場合、してみてください、<Content>
代わりに):
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
より多くの制御が必要な場合、最も用途の広いアプローチは、csprojファイルのビルドプロセスにフックするカスタムターゲットを追加することです。
<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
<Copy SourceFiles="foo.txt" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyCustomContentOnPublish" AfterTargets="Publish">
<Copy SourceFiles="foo.txt" DestinationFolder="$(PublishDir)" />
</Target>
これにより、ファイルがそれぞれのディレクトリにコピーされます。<Copy>
タスクのその他のオプションについては、そのドキュメントを参照してください。これを特定の構成に制限するには、次のCondition
属性を使用できます。
<Target … Condition=" '$(Configuration)' == 'Release' ">
このCondition
属性は、<Target>
要素またはのようなタスク要素の両方に適用できます<Copy>
。
DestinationSubDirectory="subdir\"
メタデータをReference
直接設定できます。ただし、これは、アセンブリ解決を自分で実装する必要があることを意味します(AssemblyResolveイベント)
これは問題を分類するのに役立ちましたが、サブディレクトリ内のすべてのファイルで機能するわけではありませんでした。私もではContent Include
なく使用しましたContent Update
;
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Content Include="layouts\*.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
<Content Include="layouts\**\*.*">
<Project Sdk="Microsoft.NET.Sdk.Web">
)を使用する場合Include=
、SDK内で暗黙的に指定しているように見えるため、使用できません。Update=
追加ファイルをビルドして含めるには、を使用する必要がありました。
assets\*.*
はそれを想定する必要があります。ただし、アセットフォルダ全体をコピーします。だから私は持っていますbin/Debug/netcoreapp3.1/assets/...
しかし私は資産フォルダのファイルを出力のルートディレクトリに置きたいです。bin/Debug/netcoreapp3.1/...
。
xml <Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <AssetsSourceFiles Include="assets/**/*.*"/> </ItemGroup> <Target Name="CopyCustomContent" AfterTargets="AfterBuild"> <Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" /> </Target> </Project>
より良いコード形式については私の答えを参照してください。)
assets
ルートディレクトリにフォルダがあると仮定します。好きな名前を付けることができます。これは単なる例です。
your-project.csproj
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<AssetsSourceFiles Include="assets/**/*.*"/>
</ItemGroup>
<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
<Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>
</Project>
これにより、assets
フォルダーの内容のみがフォルダーにラップされずに出力ルートにコピーされassets
ます。ただし、フォルダ自体と一緒にコピーする場合は、次のコードを使用できます。
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<Content Include="assets\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
クライアント側とサーバー側の両方で使用できるHTMLテンプレートを選択する必要がありました(Handlebars js)
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Content Update="wwwroot\html-templates\**\*.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
特定のnugetパッケージのコピーをasp.netコアプロジェクト(2.2)に強制的にコピーする必要がある場合は、csprojの最後に追加してください。
<!-- Force copy MathNet because we need it in compilation -->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="Build">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll'))" />
</Target>
<ItemGroup>
<ContentWithTargetPath Include="..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>MathNet.Numerics.dll</TargetPath>
</ContentWithTargetPath>
</ItemGroup>
<PropertyGroup>
<PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent>
</PropertyGroup>
または
<PropertyGroup>
<PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent>
</PropertyGroup>