dart-resolve-package-conflicts

Par flutter · skills

Workflow pour résoudre les conflits de versions de packages. À utiliser lorsque `pub get` échoue en raison de versions de packages incompatibles.

npx skills add https://github.com/flutter/skills --skill dart-resolve-package-conflicts

Gestion des dépendances Dart

Table des matières

Concepts fondamentaux

Dart applique une règle stricte de version unique pour les dépendances : un projet et toutes ses dépendances transitives doivent se résoudre à une seule version partagée de tout paquet donné. Cela prévient les inadéquations de type à l'exécution mais introduit le risque d'un « blocage de version ».

Pour atténuer le blocage de version, Dart s'appuie sur des contraintes de version plutôt que sur des versions épinglées dans le fichier pubspec.yaml. Le fichier pubspec.lock maintient les versions exactes résolues pour des builds reproductibles.

Comprenez les colonnes de sortie de dart pub outdated :

  • Current : La version actuellement enregistrée dans pubspec.lock.
  • Upgradable : La dernière version autorisée par les contraintes dans pubspec.yaml. dart pub upgrade se résout à celle-ci.
  • Resolvable : La version absolument la plus récente qui peut être résolue en tenant compte de toutes les autres dépendances du projet.
  • Latest : La dernière version publiée du paquet (préversions exclues).

Contraintes de version

  • Utilisez la syntaxe Caret : Utilisez toujours la syntaxe caret (par exemple, ^1.2.3) pour les dépendances dans pubspec.yaml. Cela permet à pub de sélectionner des versions plus récentes, non-cassantes (jusqu'à, mais sans inclure, la prochaine version majeure) lors de la résolution.
  • Resserrez les dépendances de développement : Définissez la limite inférieure des dev_dependencies à la version exacte actuellement utilisée. Cela réduit la complexité de résolution et empêche les anciens outils de développement incompatibles d'être sélectionnés.
  • Appliquez les lockfiles en CI : Utilisez dart pub get --enforce-lockfile dans les pipelines CI/CD pour assurer que les versions exactes testées localement sont utilisées en production.

Workflow : Audit des dépendances

Exécutez ce workflow périodiquement pour identifier les paquets obsolètes qui pourraient impacter la stabilité ou les performances.

Progression des tâches :

  • [ ] Exécutez dart pub outdated.
  • [ ] Examinez la colonne Upgradable pour identifier les paquets pouvant être mis à jour sans modifier pubspec.yaml.
  • [ ] Examinez la colonne Resolvable pour identifier les paquets nécessitant des modifications de contraintes dans pubspec.yaml pour être mis à jour.
  • [ ] Identifiez les paquets marqués comme rétractés ou discontinués.

Workflow : Mise à jour des dépendances

Utilisez une logique conditionnelle basée sur les résultats de l'audit pour mettre à jour les dépendances.

Progression des tâches :

  • [ ] Si mise à jour vers les versions « Upgradable » :
    • [ ] Exécutez dart pub upgrade.
    • [ ] Exécutez dart pub upgrade --tighten pour mettre à jour automatiquement les limites inférieures dans pubspec.yaml afin de correspondre aux versions nouvellement résolues.
  • [ ] Si mise à jour vers les versions « Resolvable » (mises à jour majeures) :
    • [ ] Modifiez manuellement pubspec.yaml pour augmenter la contrainte de version afin de correspondre à la colonne « Resolvable » (par exemple, changez ^0.11.0 en ^0.12.1).
    • [ ] Exécutez dart pub upgrade pour résoudre les nouvelles contraintes et mettre à jour pubspec.lock.
  • [ ] Boucle de rétroaction :
    • [ ] Exécutez dart analyze -> examinez les erreurs -> corrigez les changements d'API cassants.
    • [ ] Exécutez dart test -> examinez les échecs -> corrigez les régressions.

Workflow : Résolution des conflits de version

Lorsque pub ne peut pas trouver un ensemble de versions concrètes satisfaisant toutes les contraintes, ou lorsqu'il s'agit d'une version de paquet rétractée, manipulez le lockfile de manière chirurgicale.

NE PAS supprimer l'intégralité du fichier pubspec.lock et exécuter dart pub get. Cela provoque des mises à niveau incontrôlées dans tout le graphe de dépendances.

Progression des tâches :

  • [ ] Ouvrez pubspec.lock.
  • [ ] Localisez le bloc YAML spécifique du paquet en conflit ou rétracté.
  • [ ] Supprimez UNIQUEMENT l'entrée de ce paquet du lockfile.
  • [ ] Exécutez dart pub get pour récupérer la version la plus récente compatible et non-rétractée pour ce paquet spécifique.
  • [ ] Boucle de rétroaction :
    • [ ] Exécutez dart pub deps -> vérifiez que le graphe de dépendances se résout correctement.
    • [ ] Si la résolution échoue, identifiez la dépendance transitive causant le blocage, mettez à jour sa contrainte dans pubspec.yaml, et réessayez.

Exemples

Resserrage des contraintes

Quand dart pub outdated montre qu'un paquet peut être résolu à une version mineure/patch supérieure, utilisez le flag --tighten pour mettre à jour pubspec.yaml automatiquement.

Entrée (pubspec.yaml) :

dependencies:
  http: ^0.13.0

Commande :

dart pub upgrade --tighten http

Sortie (pubspec.yaml) :

dependencies:
  http: ^0.13.5

Suppression chirurgicale du lockfile

Si package_a est rétracté ou bloqué dans un conflit, supprimez uniquement son bloc de pubspec.lock.

Avant (pubspec.lock) :

packages:
  package_a:
    dependency: "direct main"
    description:
      name: package_a
      url: "https://pub.dev"
    source: hosted
    version: "1.0.0" # Retracted version
  package_b:
    dependency: "direct main"
    # ...

Action : Supprimez intégralement le bloc package_a. Laissez package_b inchangé. Exécutez dart pub get.

Skills similaires