Nous utilisons Nuget pour notre développement interne afin de nous permettre de partager le code entre les équipes. Nous rencontrons toutefois des problèmes lorsqu'une seule personne travaille sur du code qui sera déployé simultanément sur plusieurs paquets de nugets. Par exemple
A dépend de B qui dépend de C.
Les artefacts de A, B et C sont transférés dans Nuget et c’est ainsi que nous gérons les dépendances entre A, B et C. Le problème que nous constatons est que si un développeur souhaite apporter des modifications à C et les voir rapidement, doivent passer par le processus suivant.
Cela semble extrêmement pénible et amène certains de nos développeurs à s'interroger sur le choix de Nuget pour notre code développé en interne. Tout le monde aime encore le fait de consommer des paquets externes.
Existe-t-il un meilleur flux de travail pour utiliser Nuget en interne?
Dans notre société, nous avons résolu le problème des mises à jour en cascade avec la configuration suivante. Nous avons d’abord la configuration suivante pour nos référentiels NuGet et notre serveur de construction.
Chaque développeur peut avoir (mais n’a pas besoin de) un ou plusieurs répertoires sur sa propre machine qui sert de référentiel de paquet NuGet local. En utilisant un NuGet configuration spécifique à l'utilisateur, le développeur peut contrôler l'ordre dans lequel NuGet cherche dans les référentiels de paquets pour trouver les paquets.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageRestore>
<add key="enabled" value="True" />
</packageRestore>
<packageSources>
<add key="Dev" value="D:\dev\testpackages" />
<add key="Company" value="<UNC_ADDRESS_COMPANY_REPOSITORY>" />
<add key="NuGet official package source" value="https://nuget.org/api/v2/" />
</packageSources>
<disabledPackageSources />
<activePackageSource>
<add key="All" value="(Aggregate source)" />
</activePackageSource>
</configuration>
La restauration automatique des packages est activée sur toutes les solutions, ce qui évite de les appliquer à notre système de contrôle de version.
<MAJOR>.<MINOR>.<BUILD>.<REVISION>
, les développeurs ne peuvent modifier que les numéros majeur, mineur et de construction. Le numéro de révision est défini sur 0, sauf dans les versions effectuées par le serveur de génération où il correspond au numéro de version de la version. Ceci est important car cela signifie que pour une version donnée comprenant un numéro majeur, mineur et de build, le serveur de build produira toujours le numéro de version le plus élevé. Cela signifie encore une fois que NuGet préférera utiliser la version du paquet provenant du référentiel de paquets de la société (qui obtient uniquement les paquets via le serveur de construction).Afin de modifier l'une des bibliothèques de base, deux processus sont utilisés. Le premier processus est:
Si des modifications supplémentaires sont nécessaires en (A), répétez les étapes 1, 2 et 3, puis supprimez le package de (A) du répertoire de travail de (B). La prochaine fois que la compilation sera exécutée, NuGet recherchera la version spécifique de (A), la trouvera dans le référentiel de la machine locale et la récupérera. Notez que le cache NuGet peut parfois entraver ce processus, bien que il semble que NuGet ne puisse pas mettre en cache les paquets provenant de la même machine (?).
Une fois les modifications terminées, nous:
Une autre façon de faire le travail de développement est de prendre les mesures suivantes
c:\mysource\projectB\packages\ProjectA.1.2.3.4
).Le processus de validation reste le même, le projet (A) doit être préalablement engagé et dans le projet (B), la référence NuGet à (A) doit être mise à niveau.
La première approche est légèrement plus judicieuse car ce processus avertit également s’il existe des erreurs dans le package NuGet de (A) (par exemple, il est oublié d’ajouter un nouvel assemblage), tandis que dans la seconde procédure, le développeur ne le saura qu'après le package (A ) a été publié.
Vous avez deux choix ici:
J’ai utilisé les deux, et le n ° 1 est un choix raisonnable au départ, mais NuGet Galley est optimisé et conçu pour nuget.org, et non pour une utilisation sur site ou en entreprise. ).
Je dirais que vous devriez payer les frais de licence (bas) pour Artifactory Pro - c'est un excellent produit, et l'équipe JFrog est vraiment enthousiaste et branchée.
Vous ne devriez pas utiliser nuget.org pour les packages internes/d'entreprise; nuget.org est conçu pour les bibliothèques tierces/open source, pas pour les dépendances de construction internes.
EDIT: en termes de flux de travail, pourquoi mettez-vous le code shared dans plusieurs packages? Si le code doit être partagé, il doit figurer dans son propre package séparé.
EDIT 2: pour accélérer le flux de travail de modification du code pour le développeur, vous pouvez utiliser nuget.exe
(le client en ligne de commande) et des versions accessibles en ligne de commande afin de cibler une exécution de "développeur". Ensuite, dans votre version "développeur" (par opposition à la version CI), spécifiez -Source en tant que chemin local (par exemple, nuget install B -Source C:\Code\B
) lorsque vous souhaitez extraire la B
nouvellement mise à jour comme dépendance et la construire en fonction de celle-ci; de même pour C
ou d'autres packages locaux récemment mis à jour. Ensuite, lorsque A
, B
et C
se génèrent correctement, vous pouvez git Push
tous (dans l’ordre de dépendance inverse) et laisser CI faire son travail.
Cependant, vous devriez aussi vous demander si la séparation de vos paquets est vraiment appropriée si vous devez souvent construire cela «danser», car cela suggère que tout le code devrait être dans un seul paquet, ou éventuellement divisé en différentes lignes dans paquets séparés. Une caractéristique clé d'un paquet bien défini est qu'il devrait pas provoquer des effets d'entraînement sur les autres paquets, surtout si vous utilisez Version sémantique de manière efficace.
Edit 3 Certaines précisions demandées par marcelo-oliveira: "Les versions accessibles en ligne de commande" sont des versions qui peuvent être exécutées entièrement à partir de la ligne de commande, sans utiliser Visual Studio, généralement via des fichiers de traitement par lots. Une "version développeur" est une version qu'un développeur exécute à partir de son poste de travail, par opposition à la génération CI qui s'exécute sur le serveur CI (les deux versions doivent être essentiellement les mêmes).
Si A, B et C font partie de la même solution, vous pouvez créer des packages NuGet pour eux dans une même construction.
Assurez-vous simplement que le paquet using a le nouveau numéro de version (en supposant que votre construction ne le change pas au hasard) du paquet dont il dépend.
Si A, B et C sont intentionnellement sous différentes solutions par ex. A est sous une solution d'infrastructure et B est sous une solution de produit, la seule suggestion que je puisse vous faire est de définir vos générations de CI exécutées à l'enregistrement et non périodiquement.
Modifier:
Une autre option consiste à créer un package Push pre-release (par exemple, version 1.0.0-alpha) sur votre serveur NuGet lors de la génération locale, afin que les développeurs puissent expérimenter le package avant de créer une version.
Nuget a été conçu pour partager des bibliothèques tierces. Nous prévoyons d'utiliser Nuget en interne pour tout code commun pouvant être partagé entre des projets. Des éléments tels qu'une couche de données commune, une chaîne et d'autres fonctions d'expressions régulières, des composants de messagerie et d'autres artefacts similaires.
La seule façon dont je vois l'aide de Nuget est lorsque les composants, le code ou les artefacts que vous partagez entre les équipes/projets sont stables et que leur propre cycle de publication diffère de celui de votre projet. Pour vos besoins, Nuget est une overkill. Vous pourriez avoir une meilleure productivité reliant tous ces projets au sein de la même solution. Votre structure de solution doit inclure les trois projets A, B et C en tant que projets dépendants référencés en interne si nécessaire.