web-dev-qa-db-ja.com

csproj dotnetcoreを使用してファイルを出力ディレクトリにコピーします

したがって、私の問題は非常に単純です。デバッグビルドであろうとリリースパブリッシュであろうと、ビルド出力ディレクトリにコピーしたいファイルがいくつかあります。私が見つけることができる情報はすべて、古いjson configアプローチに関するものです。 dotnetcoreでcsprojを使用した例はありますか?

58
Theyouthis

ニーズに応じて、目標を達成する方法はかなりあります。

最も簡単な方法は、メタデータ(CopyToOutputDirectory/CopyToPublishDirectory)アイテムを条件付きで設定することです(Noneではなく、.txtContentアイテムであると仮定します)仕事、代わりに<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>などのタスク要素の両方に適用できます。

90
Martin Ullrich

これにより問題を整理することができましたが、サブディレクトリ内のすべてのファイルで機能しませんでした。 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>
41
Mr Moose

これを.csprojファイルに配置し、nlog.configを目的のファイルパスに置き換えます。次に、単に保存してプロジェクトをビルドします。

<ItemGroup>
  <Content Update="Nlog.config">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>
12
Chad Kuehn

クライアント側とサーバー側の両方で消費できる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>
1
hngr18

特定の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>
0
gab89