Hoe werkt de eigenschap “replace” met componist?

Dus hoe werkt de eigenschap “replace” met componist? Ik heb het document van de componist gelezen, maar begrijp het nog steeds niet. Zoeken naar meer informatie heeft mijn vragen niet beantwoord.

Als ik naar het bestand composer.json op Laravel/Frameworkop github kijk. Ik kan niet zien hoe vervangen zal werken. Kan iemand mij uitleggen hoe dit werkt? En waar zal de variabele “self.version” gelijk aan zijn?


Antwoord 1, autoriteit 100%

De Composer-documentatie geeft twee basisvoorbeelden. Ik zal proberen het uit te leggen:

Hiermee worden pakketten weergegeven die door dit pakket zijn vervangen. Dit stelt je in staat om een ​​pakket te forken, te publiceren onder een andere naam met zijn eigen versienummers, terwijl pakketten die het originele pakket nodig hebben, blijven werken met je fork omdat het het originele pakket vervangt.

Stel dat uw software original/libraryen other/packagegebruikt, waarvoor zelf ook original/librarynodig is.

Nu denk je dat original/libraryeen functie moet integreren, maar de beheerders zullen je suggestie niet laten gebeuren in hun pakket. Je besluit die bibliotheek te forken onder de naam better/libraryen een nieuwe release te taggen.

Terug naar uw software. Natuurlijk zou het better/librarymoeten gaan gebruiken, dus je hebt dat in plaats daarvan nodig, maar dat other/packagevereist nog steeds de original/library– code duplicatie! Hoe kun je ervoor zorgen dat dat andere pakket je better/librarygebruikt zonder het ook te forken en alleen de componist.json te wijzigen (je bent nog steeds compatibel met dat original/library, dus het zou moeten werken)?

Je voegt een vervangsleutel toe aan je composer.json:

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

Nu weet Composer dat elk pakket uit uw better/libraryeven goed is als de original/libraryals het gaat om het oplossen van de afhankelijkheden van de other/package.

Dit is ook handig voor pakketten die subpakketten bevatten, bijvoorbeeld het hoofd symfony/symfony pakket bevat alle Symfony Componenten die ook beschikbaar zijn als individuele pakketten. Als u het hoofdpakket nodig heeft, zal het automatisch aan alle vereisten van een van de afzonderlijke componenten voldoen, aangezien het deze vervangt.

Dezelfde regels, een iets andere invalshoek: het vereisen van componenten van een framework is een goede benadering voor elk ander onderdeel dat een of andere functie nodig heeft. Maar als u het volledige raamwerk in uw software nodig heeft, en een andere bibliotheek, die vervolgens ook een onderdeel van dat raamwerk nodig heeft, zorgt de replace-declaratie van het raamwerk ervoor dat Composer dat ene onderdeel niet twee keer hoeft te installeren, omdat het al in het volledige raamwerk is opgenomen.

Pas op: tijdelijke aanduidingen in vervangen versies zijn meestal slecht

In mijn oorspronkelijke antwoord stelde ik voor:

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

Dit heeft gevolgen: Composer zal nu uw bibliotheekversie 1.0.0 behandelen als ELKE versie 1.x van de originele bibliotheek, zelfs als ze dingen repareren of functies toevoegen en op een dag versie 1.2.34 uitbrengen. Dit betekent ook dat als uw other/packageop een dag een update krijgt en original/library:^1.1vereist is, de vervanging in YOURbibliotheek is nog steeds actief en stelt dat het ELKE versie 1.*kan vervangen, zelfs zonder dat je iets binnenin bijwerkt – wat het niet kan, je oude code zal nooit nieuwe functies van de originele bibliotheek implementeren zonder dat je wat werk doet , maar de vervanging geeft precies dit aan.

Dus in wezen: vermijd wildcard-versies in de vervangende versie! Als je ze gebruikt, doe je een uitspraak over de toekomst die je niet kunt weten of voorspellen (tenzij je original/librarykunt controleren, maar wees dan zelfs dan heel voorzichtig). Gebruik altijd een specifieke versie van de original/librarydie u kent en die u volledig opnieuw kunt implementeren.


Antwoord 2, autoriteit 9%

Wanneer u uw eigen pakket maakt, definieert u in uw composer.jsonwat voor soort pakketten het doet providewat in feite Composervertelt dat uw pakket het al heeft geïnstalleerd, dus u hoeft het niet opnieuw te installeren.

Als je replaceeigenschapgebruikt, vertelt Composer dat uw pakket het originele pakket wil vervangen door uw eigen fork, zodat andere pakketten het niet hoeven te installeren.

Als het pakket a/abijvoorbeeld b/bvereist en u zegt b/bte vervangen, wordt het niet gedownload op Composer install/update.

Dit wordt hier in meer detail uitgelegd: Hoe werkt de eigenschap “replace” in Composer?

Hoe werkt de eigenschap

Other episodes