web-dev-qa-db-fra.com

Copier les fichiers dans le répertoire de sortie en utilisant csproj dotnetcore

Donc, mon problème est assez simple. Il y a des fichiers que je veux copier dans le répertoire de sortie de la construction, qu'il s'agisse d'une version de débogage ou d'une publication publiée. Toute l'information que je peux trouver concerne l'ancienne approche de configuration JSON. Quelqu'un at-il un exemple utilisant le csproj avec dotnetcore?

58
Theyouthis

Il existe plusieurs moyens d'atteindre vos objectifs, en fonction de vos besoins.

La méthode la plus simple consiste à définir les éléments de métadonnées (CopyToOutputDirectory/CopyToPublishDirectory) de manière conditionnelle (en supposant que .txt soit un élément None au lieu de Content, si ce n'est pas le cas. travail, essayez plutôt <Content>):

<ItemGroup Condition="'$(Configuration)' == 'Debug'">
  <None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

Si davantage de contrôle est requis, l’approche la plus polyvalente consiste à ajouter des cibles personnalisées qui s’intègrent au processus de construction dans le fichier 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>

Ceci copie un fichier dans les répertoires respectifs. Pour plus d'options pour la tâche <Copy>, voir sa documentation . Pour limiter cela à certaines configurations, vous pouvez utiliser un attribut Condition:

<Target … Condition=" '$(Configuration)' == 'Release' ">

Cet attribut Condition peut être appliqué à la fois sur l'élément <Target> ou sur des éléments de tâche tels que <Copy>.

90
Martin Ullrich

Bien que cela m'a aidé à résoudre mon problème, cela ne fonctionnait pas pour tous les fichiers d'un sous-répertoire. J'ai aussi utilisé Content Include plutôt que 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

Placez-le dans votre fichier .csproj en remplaçant nlog.config par le chemin de fichier souhaité. Ensuite, sauvegardez-le et construisez votre projet:

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

J'avais besoin d'une sélection de modèles HTML pour être consommable à la fois côté client et côté serveur (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

Merci de sauver ma journée. Si vous devez forcer la copie d’un paquet nuget spécifique dans un projet central asp.net (2.2), ajoutez à la fin de votre 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