web-dev-qa-db-fra.com

Comment ajouter des fichiers supplémentaires à un package de nugets dans Visual Studio 2017

J'ai récemment déménagé vers Visual Studio 2017 Community Edition. Il a 2 belles nouvelles fonctionnalités 

  1. Vous n'avez pas besoin d'inclure explicitement vos fichiers source dans le fichier csproj, cela fait cela automatiquement,
  2. il peut construire directement des paquets Nuget.

Je souhaite créer un package open source CodeFirstWebFramework DLL en tant que package Nuget. En plus d'inclure la variable DLL, le package doit inclure une arborescence complète de répertoires contenant d'autres fichiers (y compris les fichiers .js, .tmpl, .css et .md).

Comment puis-je dire à Visual Studio que je veux que cette arborescence de répertoires soit incluse dans le package?

D'après les informations que j'ai trouvées lors de recherches approfondies et en ignorant toutes les informations obsolètes impliquant l'ajout de fichiers au csproj, tout ce que j'ai pu trouver a été de les placer dans un dossier contentFiles, mais cela ne semble pas fonctionner.

Mon fichier de projet ressemble à ceci:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net45</TargetFramework>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <Authors>Nikki Locke</Authors>
    <Company>Trumphurst Ltd</Company>
    <Description>Easy to use web server for building web apps that use sql databases generated from c# classes</Description>
    <Copyright>2017 Trumphurst Ltd.</Copyright>
    <PackageProjectUrl>https://github.com/nikkilocke/CodeFirstWebFramework</PackageProjectUrl>
    <RepositoryUrl>https://github.com/nikkilocke/CodeFirstWebFramework</RepositoryUrl>
    <RepositoryType>Github</RepositoryType>
    <PackageTags>C# SQL Code First Web Server</PackageTags>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.12.1" />
    <PackageReference Include="Mono.Data.Sqlite.Portable" Version="1.0.3.5" />
    <PackageReference Include="mustache-sharp" Version="0.2.10" />
    <PackageReference Include="MySql.Data" Version="6.9.9" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.Net" />
    <Reference Include="System.Web" />
  </ItemGroup>

</Project>

Devinant de manière extravagante ce que je devrais peut-être faire à partir d'informations contradictoires et obsolètes sur le Web, j'ai ajouté ce qui suit:

  <ItemGroup>
    <Content Include="contentFiles/**/*.*" copyToOutput="true">
      <IncludeInPackage>true</IncludeInPackage>
    </Content>
  </ItemGroup>

Le fichier .nupkg a maintenant le contenu du dossier contentFiles insider (à deux endroits, un dossier content et un dossier contentFiles.

Cependant, lorsque j'installe le package dans un autre projet, les fichiers de contenu n'apparaissent pas, bien qu'ils soient répertoriés dans le fichier project.assets.json du dossier obj.

15
Nikki Locke

J'ai maintenant changé à nouveau mon fichier de projet, il se lit maintenant comme suit:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net45</TargetFramework>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <Authors>Nikki Locke</Authors>
    <Company>Trumphurst Ltd</Company>
    <Description>Easy to use web server for building web apps that use sql databases generated from c# classes</Description>
    <Copyright>2017 Trumphurst Ltd.</Copyright>
    <PackageProjectUrl>https://github.com/nikkilocke/CodeFirstWebFramework</PackageProjectUrl>
    <RepositoryUrl>https://github.com/nikkilocke/CodeFirstWebFramework</RepositoryUrl>
    <RepositoryType>Github</RepositoryType>
    <PackageTags>C# SQL Code First Web Server</PackageTags>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.12.1" />
    <PackageReference Include="Mono.Data.Sqlite.Portable" Version="1.0.3.5" />
    <PackageReference Include="mustache-sharp" Version="0.2.10" />
    <PackageReference Include="MySql.Data" Version="6.9.9" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.Net" />
    <Reference Include="System.Web" />
  </ItemGroup>

  <ItemGroup>
    <Content Include="contentFiles/**/*.*" copyToOutput="true">
      <IncludeInPackage>true</IncludeInPackage>
      <CopyToOutput>true</CopyToOutput>
      <BuildAction>Content</BuildAction>
      <copyToOutput>true</copyToOutput>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <Compile Remove="Phone\**" />
    <EmbeddedResource Remove="Phone\**" />
    <None Remove="Phone\**" />
  </ItemGroup>

</Project>

Les fichiers contentFiles sont maintenant copiés avec succès dans un dossier du même nom (c'est-à-dire contentFiles) dans tout projet qui télécharge le package NuGet.

Le contenu n'est pas automatiquement copié dans le dossier de sortie du projet lors de la compilation, malheureusement - les suggestions sont les bienvenues.

4
Nikki Locke

Envelopper dans "Content" et "IncludeInPackage" suffit à copier le (s) fichier (s) dans le package. 

1
user3724031

Tout d’abord, sachez que vous devez placer vos fichiers dans un dossier content ou contentFiles en fonction de la manière dont le package de nuget est référencé. Voir la fin de cette section section .

Fondamentalement, si un fichier nuget est référencé par fichier package.config, les fichiers du dossier de contenu du package nuget seront copiés dans le projet référent. Si le package de nuget est référencé par PackageReference dans le fichier de projet, les fichiers du dossier contentFiles du package seront utilisés. Il est recommandé d'inclure les deux.

La structure du dossier contentFiles peut être trouvée ici . Il est possible de spécifier la langue et la structure des fichiers à copier. 

Donc dans votre cas:

<ItemGroup>
    <Content Include="contentFiles/**/*.*">
        <Pack>true</Pack>
        <PackagePath>contentFiles\any\any;content</PackagePath>
    </Content>
</ItemGroup>
0
Fabian