web-dev-qa-db-fra.com

Qu'est-ce que le fichier d'accessoires Nuget et à quoi sert-il?

J'ai regardé et lu beaucoup mais je n'ai pas trouvé de réponse définitive qui expliquerait à quoi sert le fichier "nuget.props" et à quoi sert-il?

Une explication et peut-être avec un exemple serait utile?

9
Dave23Rave

À partir de quelques informations générales, les projets .NET sont créés avec MSBuild. .csproj D'un projet C # est juste un fichier de projet MSBuild avec une extension de fichier qui signale par convention qu'il s'agit de C # et non d'un autre langage, mais pour MSBuild, c'est juste un fichier de projet. MSBuild n'a que quelques types de base, propriétés, éléments, cibles et tâches. Par convention, les propriétés et les éléments vont dans des fichiers avec l'extension .props, Tandis que les tâches et les cibles vont dans des fichiers se terminant par .targets. C'est pourquoi si vous regardez les fichiers csproj à l'ancienne, vous verrez <Import Project="path\to\Microsoft.Common.CSharp.props" /> Et <Import Project="path\to\Microsoft.Common.CSharp.props" />. Les nouveaux projets de style SDK sont essentiellement du sucre syntaxique pour faire exactement la même chose.

Ensuite, les équipes MSBuild et .NET ont rendu le système de build extensible. Ainsi, plutôt que d'être limité à ce que Microsoft a intégré au système de compilation/compilation C #, vous pouvez remplacer des parties du système de build ou y ajouter des éléments supplémentaires. Sans NuGet, la façon de procéder consiste à créer vos propres fichiers .props Et .targets Quelque part, puis à modifier vos .csproj Et à ajouter des instructions <Import ... />. Cela peut fonctionner correctement si vos accessoires et cibles sont dans le même référentiel de code source que celui qui l'utilise, mais la modification de votre csproj et le codage en dur du chemin vers les fichiers props et targets ne fonctionnent pas si bien sinon.

NuGet peut vous y aider. Si vous créez un package avec conventions appropriées , NuGet s'assurera que les accessoires et les cibles sont découverts et utilisés dans la génération. Avec les projets utilisant packages.config, NuGet éditera le csproj pour vous lors de l'installation/mise à niveau/désinstallation. Projets utilisant PackageReference, NuGet écrira un fichier dans le répertoire intermédiaire (dossier obj/) Nommé nuget.g.props Et nuget.g.targets, Qui importe tous les props et targets fichiers de tous les packages NuGet référencés, et le système de génération utilise ces fichiers.

Le premier exemple que je pourrais comprendre pourquoi quelqu'un voudrait faire cela est si vous souhaitez utiliser une version plus récente du compilateur .NET que celle installée sur votre système. Il vous suffit de référencer le package Microsoft.Net.Compilers , et .props Et .targets Dans le package remplaceront les cibles/tâches de compilation dans le système de construction installé par le système, et utilisez celui du package à la place. Cela vous permet d'utiliser de nouvelles fonctionnalités de langage avant l'installation du compilateur sur votre système, ou si vous voulez vous assurer que toutes les versions de votre code utilisent le même compilateur, même si différents développeurs ou agents CI ont différentes versions de choses installées.

Un autre exemple peut être des scripts précompilés. Si vous avez votre propre langage de script, créez des outils de génération qui les convertissent en fichiers C #, puis écrivez les accessoires et les cibles MSBuild qui s'exécuteront avant la "vraie construction" pour convertir votre langage personnalisé en C #, enregistrez le .cs Généré fichiers dans le dossier intermédiaire, ajoutez des éléments MSBuild Compile pour ces fichiers générés, puis le compilateur C # le compilera avec tous les autres fichiers .cs du projet. Vous aurez besoin d'une connaissance raisonnable de MSBuild et du système de génération .NET, mais c'est possible.

12
zivkan