Maison  >  Article  >  outils de développement  >  Utilisez l'attribut replace pour éviter les conflits de dépendances avec Composer

Utilisez l'attribut replace pour éviter les conflits de dépendances avec Composer

藏色散人
藏色散人avant
2021-03-12 11:28:593825parcourir

La rubrique suivante du tutoriel de com poser présentera comment utiliser l'attribut replace pour éviter les conflits de dépendances dans Composer. J'espère que cela sera utile aux amis dans le besoin !

La documentation Composer fournit deux exemples de base. Je vais essayer d'expliquer :

Liste les packages qui sont remplacés par ce package. De cette façon, vous pouvez créer un package et le publier sous un nom différent avec votre propre numéro de version, et les packages qui nécessitent le package d'origine peuvent continuer à utiliser votre package fork car il remplace le package d'origine.

En supposant que votre logiciel utilise original/library et other/package, ils nécessitent eux-mêmes original/library.

Maintenant, vous pensez original/library que de nouvelles fonctionnalités doivent être intégrées, mais les responsables ne sont pas d'accord avec votre suggestion d'être implémentée dans leur package. Vous décidez donc de créer une bibliothèque sous le nom better/library et de marquer une nouvelle version.

Retour au logiciel. Bien sûr, il devrait commencer à utiliser le package better/library, alors utilisez-le à la place, mais other/package nécessite toujours original/library - duplication de code ! Comment faire en sorte que ce package utilise votre better/library au lieu de original/library ? Au lieu de le bifurquer et de simplement modifier composer.json (vous êtes toujours compatible avec original/library donc ça devrait fonctionner) ?

Vous devez ajouter le mot-clé replace dans composer.json :

"replace": {
    "original/library":"1.0.2"
}

Maintenant, Composer sait que lors de la résolution de la dépendance de "other/package", tout package de "better/library" est aussi bon comme "original/bibliothèque".

Ceci est également utile pour les packages qui contiennent des sous-packages, par exemple le package principal symfony/symfony contient tous les composants Symfony, qui sont également disponibles sous forme de packages séparés. Si vous avez besoin du package principal, il satisfera automatiquement aux exigences de l'un des composants individuels puisqu'il les remplacera.

Même règle, juste un angle légèrement différent : intégrer les composants du framework est une bonne solution pour tout autre composant nécessitant certaines fonctionnalités. Cependant, si vous avez besoin d'un framework complet dans votre logiciel et qu'une autre bibliothèque nécessite un composant de ce framework, la déclaration replace du framework évite à Composer d'avoir à installer ce composant unique deux fois car il est déjà inclus dans le framework complet.

Remarque : remplacer les espaces réservés dans les builds est généralement mauvais

Dans ma réponse originale, j'ai suggéré :

"replace": {
    "original/library":"1.*"
}

Ceci La conséquence est : le compositeur va maintenant traiter la version 1.0.0 de votre bibliothèque est aussi bonne que n'importe quelle version 1.x de la bibliothèque d'origine, même si un jour ils corrigent quelque chose ou ajoutent des fonctionnalités et publient la version 1.2.34. Cela signifie également que si un jour votre "autre/package" est mis à jour et nécessite "original/library:^1.1", votre remplacement dans la bibliothèque est toujours actif et déclare qu'il peut être remplacé par n'importe quelle version 1*, même si vous ne mettez rien à jour en interne - cela ne sera pas fait, mais si vous ne faites aucun travail, votre ancien code n'implémentera jamais les nouvelles fonctionnalités de la bibliothèque d'origine, mais le contenu de remplacement s'affiche simplement J'ai ça.

Donc, essentiellement : évitez d'utiliser des versions génériques dans les versions de remplacement ! Si vous les utilisez, vous faites des déclarations sur l'avenir que vous ne pouvez pas connaître ou prédire (à moins que vous ne puissiez contrôler original/library , mais même dans ce cas, soyez très prudent). Assurez-vous d'utiliser original/library que vous connaissez et que vous pouvez complètement réimplémenter.

Adresse originale : https://stackoverflow.com/questions/18882201/how-does-the-replace-property-work-with-composer

Adresse de traduction : https : //learnku.com/laravel/t/55200

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer