J'ai récemment déménagé vers Visual Studio 2017
Community Edition. Il a 2 belles nouvelles fonctionnalités
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
.
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.
Envelopper dans "Content" et "IncludeInPackage" suffit à copier le (s) fichier (s) dans le package.
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>