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


103

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

回答:


143

あなたのニーズが何であるかに応じて、あなたの目標を達成するためのかなりの数の方法があります。

最も簡単な方法は、(メタデータを設定している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>


'DestinationFolder'を<Reference>アイテムに適用するにはどうすればよいですか、またはイベントが可能ですか、ドキュメントにはあまりありません。すべてのアセンブリをルートレベルに配置するのではなく、独自のフォルダーに配置することをお勧めします。
Reahreic

アイテムにDestinationSubDirectory="subdir\"メタデータをReference直接設定できます。ただし、これは、アセンブリ解決を自分で実装する必要があることを意味します(AssemblyResolveイベント
Martin Ullrich

それぞれのフォルダにいくつかのdllを含む親フォルダをコピーするにはどうすればよいですか。起動時にこれらのdllをプラグインとしてロードするときに、これらのフォルダーをビルドした後、実行時にアプリケーションで使用できるように、出力公開パスでそれらを使用できるようにします。私はMacでライダーを使用しています
kuldeep

93

これは問題を分類するのに役立ちましたが、サブディレクトリ内のすべてのファイルで機能するわけではありませんでした。私もでは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>

3
他のすべての回答/提案の他のすべての順列は、私にとってはうまくいきませんでした。詳細なビルド出力でのファイルについての言及すらありません。しかし、ここでのあなたの提案はうまくいきました。
user78178 0818

15
あなたは中間サブフォルダを含める場合と使用<Content Include="layouts\**\*.*">
JSancho

3
Web SDK(<Project Sdk="Microsoft.NET.Sdk.Web">)を使用する場合Include=、SDK内で暗黙的に指定しているように見えるため、使用できません。Update=追加ファイルをビルドして含めるには、を使用する必要がありました。
notracs

よろしくお願いします。しかし、フォルダ自体ではなく、フォルダの内容のみを出力ディレクトリにコピーする方法。式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> より良いコード形式については私の答えを参照してください。)
Dominik

15

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

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

これはサブディレクトリをコピーしているようには見えません。
ヌル

13

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>

3

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

0

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

1
理想的には、<Copy>タスクを使用してクロスプラットフォームにします。
ブルーノ・ガルシア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.