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/library
en other/package
gebruikt, waarvoor zelf ook original/library
nodig is.
Nu denk je dat original/library
een 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/library
en een nieuwe release te taggen.
Terug naar uw software. Natuurlijk zou het better/library
moeten gaan gebruiken, dus je hebt dat in plaats daarvan nodig, maar dat other/package
vereist nog steeds de original/library
– code duplicatie! Hoe kun je ervoor zorgen dat dat andere pakket je better/library
gebruikt 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/library
even goed is als de original/library
als 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/package
op een dag een update krijgt en original/library:^1.1
vereist 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/library
kunt controleren, maar wees dan zelfs dan heel voorzichtig). Gebruik altijd een specifieke versie van de original/library
die u kent en die u volledig opnieuw kunt implementeren.
Antwoord 2, autoriteit 9%
Wanneer u uw eigen pakket maakt, definieert u in uw composer.json
wat voor soort pakketten het doet provide
wat in feite Composervertelt dat uw pakket het al heeft geïnstalleerd, dus u hoeft het niet opnieuw te installeren.
Als je replace
eigenschapgebruikt, 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/a
bijvoorbeeld b/b
vereist en u zegt b/b
te vervangen, wordt het niet gedownload op Composer install
/update
.
Dit wordt hier in meer detail uitgelegd: Hoe werkt de eigenschap “replace” in Composer?