Le contrôle de version doit contenir le code et la configuration nécessaires à la création de l'application.
Cela signifie que:
Les éléments temporaires qui ont été introduits pendant un court laps de temps (le temps nécessaire pour localiser l'emplacement d'un bogue ou pour expérimenter une fonctionnalité d'une langue, par exemple) ne devraient pas être dans un contrôle de version: conservez-le jusqu'à ce que vous en ayez besoin , puis supprimez-le simplement lors de la validation .
Les fichiers locaux propres à une machine particulière peuvent être conservés dans une branche.
J'éviterais de les garder juste localement, car c'est trop pénible de refaire tout ça quand votre ordinateur portable est volé ou qu'un virus vous oblige à réinstaller le système d'exploitation (et d'ailleurs, vous constatez que votre dernière sauvegarde a été effectuée il y a deux ans) .
D'un autre côté, soyez prudent avec la structure des fichiers: la configuration locale est OK, jusqu'à ce qu'elle devienne écrasante, et vous oblige à faire un seul changement dans chaque fichier de chacun des 42 développeurs participant au projet.
Surveillez l'opportunité de supprimer les particularités entre les machines. Cela peut signifier:
Donner un accès à un serveur SQL dev pour remplacer les instances locales sur les machines des développeurs,
Utiliser des services de distribution de packages comme Pypi ou npm pour les packages publics et leurs homologues privés pour les packages internes,
Demandez aux membres de l'équipe d'installer les mêmes versions de logiciels,
Rendez les mises à jour logicielles aussi transparentes que possible,
Ou permettre de déployer le système d'exploitation et les logiciels nécessaires sur une machine en un clic (plus le temps pour chaque développeur d'installer son Vim vs Emacs préféré, Chrome vs Firefox, etc.)
Alors:
Fichiers de projet. Il peut être nécessaire de modifier les chemins afin de refléter la disposition sur le PC actuel.
Pourquoi ne pas utiliser la même disposition sur chaque PC? Les chemins au sein du projet doivent être relatifs au fichier de projet, ce qui signifie que peu importe où se trouve le projet. Les versions des logiciels et des bibliothèques doivent être identiques pour éviter les bogues cryptiques qui n'apparaissent que sur certaines machines et sont impossibles à reproduire pour les autres membres de l'équipe.
Exemple:
Dans un projet créé avec Visual Studio, vous pouvez trouver:
Les fichiers eux-mêmes. Les chemins étant relatifs, peu importe que sur ma machine, le projet soit localisé pendant H:\Development\Hello World Project\
que d'autres membres de l'équipe l'ont extrait C:\Work\HelloWorld\
.
Les dépendances, c'est-à-dire les bibliothèques tierces et internes. Les deux types doivent être gérés par NuGet, ce qui rend toutes les discussions liées aux conflits obsolètes. Si vous n'avez pas la même version de la bibliothèque que moi, demandez à NuGet de mettre à jour les dépendances. Aussi simple que ça (quand ça marche bien, ce qui n'est pas toujours le cas).
Notez qu'il est crucial de conserver également les bibliothèques internes dans un NuGet privé. Avoir un tas de bibliothèques stockées dans un dossier partagé ou envoyées par e-mail à travers une équipe conduit à l'anarchie et aux serveurs CI dépressifs.
Les paramètres. Il est crucial que l'équipe partage les mêmes paramètres. Si la moitié de l'équipe décide de traiter les avertissements comme des erreurs et la moitié de l'équipe conserve les avertissements tels quels, les membres de la première partie de l'équipe passeront leur temps à supprimer les avertissements générés par les développeurs de la deuxième partie de l'équipe.
Les paramètres liés aux utilitaires. Celles-ci sont délicates, car certains membres de l'équipe peuvent avoir installé certains utilitaires, tandis que d'autres ne l'ont pas fait.
Il est fortement recommandé d'installer le même ensemble d'outils. Si certains programmeurs veulent utiliser StyleCop, mais d'autres non, l'équipe ne fera pas le travail. Si certains utilisent des contrats de code mais d'autres pas, ils auront les mêmes problèmes.
Makefiles. Par exemple, l'optimisation peut devoir être désactivée pendant le débogage, mais pas pour le serveur CI.
Gardez plusieurs makefiles dans le contrôle de version. Il n'est pas rare de créer une version de débogage sur le serveur CI et de la pousser vers un client qui rencontre un bug délicat.
Hacks laids sales. Par exemple, retournez 7 au milieu d'une fonction, afin de tester quelque chose, selon la fonction, et soupçonné de casser à la valeur 7.
J'éviterais un tel code en premier lieu. Pour tester quelque chose, utilisez des tests unitaires. Si cela prend vraiment quelques secondes pour échanger du code à des fins de débogage , faites-le, mais vous supprimerez ce code dans quelques minutes de toute façon, il n'est donc pas nécessaire de le valider.
Comme vous le décrivez, vous devez écrire un test. Par exemple, si vous voulez être sûr que:
class TemperatureConverter
{
public int CelsiusToFahrenheit(int temperature)
{
...
}
}
lève une exception lorsqu'il temperature
est inférieur à AbsoluteZero
constant, vous ne devez pas jouer avec le code lui-même. Créez plutôt un test unitaire qui:
- auto-documenter votre code,
- augmenter la fiabilité de votre code,
- s'assurer que les responsables peuvent s'appuyer sur des tests de régression lors de la modification de la méthode ci-dessus,
- servir aux autres développeurs de votre équipe qui peuvent avoir besoin de faire le même test.