Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Minimale versiebeheer
vcpkg maakt gebruik van een minimale selectiebenadering voor versiebeheer, geïnspireerd op de versie die door Go wordt gebruikt, maar op een aantal manieren gewijzigd:
- Start altijd vanaf een nieuwe installatie en elimineert de noodzaak van upgrade-/downgradebewerkingen.
- Niet-getrainde afhankelijkheden toestaan door basislijnen te introduceren.
Het minimale selectieprincipe blijft echter hetzelfde. Gezien een set beperkingen gebruikt vcpkg de 'oudste' mogelijke versies van pakketten die aan alle beperkingen kunnen voldoen.
Het gebruik van een minimale versiebenadering heeft de volgende voordelen:
- Het is voorspelbaar en gemakkelijk te begrijpen.
- Gebruikers bepalen wanneer upgrades plaatsvinden, zoals in, worden er geen upgrades automatisch uitgevoerd wanneer er een nieuwe versie wordt uitgebracht.
- Vermijd het gebruik van een SAT-oplosser.
Bekijk de volgende pakketgrafiek om een voorbeeld te geven:
(A 1.0) -> (B 1.0)
(A 1.1) -> (B 1.0)
-> (C 3.0)
(A 1.2) -> (B 2.0)
-> (C 3.0)
(C 2.0)
En het volgende manifest:
{
"name": "example",
"version": "1.0.0",
"dependencies": [
{ "name": "A", "version>=": "1.1" },
{ "name": "C", "version>=": "2.0" }
],
"builtin-baseline": "<some git commit with A's baseline at 1.0>"
}
Na de boekhouding voor transitieve afhankelijkheden hebben we de volgende set beperkingen:
- A >= 1,1
- B >= 1,0
- C >= 3,0
- C >= 2,0
Omdat vcpkg aan alle beperkingen moet voldoen, wordt de set geïnstalleerde pakketten:
-
A 1.1, zelfs wanneerA 1.2er bestaat, zijn er geen beperkingen hoger dan1.1dus vcpkg selecteert de minimale versie mogelijk. -
B 1.0, transitief vereist doorA 1.1. -
C 3.0, bijgewerkt door de transitieve beperking die doorA 1.1is toegevoegd om te voldoen aan versiebeperkingen.
Beperkingsresolutie
Op basis van een manifest met een set versieafhankelijkheden probeert vcpkg een pakketinstallatieplan te berekenen dat voldoet aan alle beperkingen.
Versiebeperkingen zijn in de volgende varianten:
-
Gedeclareerde beperkingen: Beperkingen die expliciet zijn gedeclareerd in het manifest op het hoogste niveau met behulp van
version>=. -
Basislijnbeperkingen: Beperkingen die impliciet zijn toegevoegd door de
builtin-baseline. - Transitieve beperkingen: Beperkingen die indirect worden toegevoegd door afhankelijkheden van uw afhankelijkheden.
-
Overschreven beperkingen: beperkingen die worden overschreven in het manifest op het hoogste niveau met behulp van
overridesdeclaraties.
Voor het berekenen van een installatieplan volgt vcpkg ongeveer de volgende stappen:
- Voeg alle beperkingen op het hoogste niveau toe aan het plan.
- Recursief transitieve beperkingen toevoegen aan het plan.
- Telkens wanneer een nieuw pakket wordt toegevoegd aan het plan, voegt u ook de basislijnbeperking toe aan het plan.
- Telkens wanneer een beperking wordt toegevoegd:
- Als er een onderdrukking bestaat voor het pakket
- Selecteer de versie in de onderdrukking.
- Anders:
- Als er geen vorige versie is geselecteerd.
- Selecteer de minimale versie die voldoet aan de beperking.
- Als er een vorige versie is geselecteerd:
- Als het versiebeheerschema van de nieuwe beperking niet overeenkomt met die van de eerder geselecteerde versie:
- Voeg een versieconflict toe.
- Als de versie van de beperking niet vergelijkbaar is met de eerder geselecteerde versie. Bijvoorbeeld door 'version-string: apple' te vergelijken met 'version-string: orange':
- Voeg een versieconflict toe.
- Als de versie met beperkingen hoger is dan de eerder geselecteerde versie:
- Selecteer de hoogste versie.
- Anders:
- Houd de vorige selectie behouden.
- Als het versiebeheerschema van de nieuwe beperking niet overeenkomt met die van de eerder geselecteerde versie:
- Als er geen vorige versie is geselecteerd.
- Bekijk het plan:
- Als er geen conflicten zijn
- De geselecteerde pakketten installeren
- Anders:
- De conflicten rapporteren aan de gebruiker
- Als er geen conflicten zijn
Poortversies verkrijgen
Hoewel het concept van pakketversies altijd aanwezig is in vcpkg, is het concept van versiebeperkingen niet.
Met de introductie van versiebeheerbeperkingen is het nu mogelijk dat een pakket afhankelijk is van een poortversie die niet overeenkomt met de versie die lokaal beschikbaar is. Dit leidt tot een probleem omdat vcpkg moet weten hoe de poortbestanden voor de aangevraagde versie moeten worden verkregen.
Er is een nieuwe set metagegevensbestanden geïntroduceerd om dit probleem op te lossen. Deze bestanden bevinden zich in de versions/ map op het hoofdniveau van de vcpkg-opslagplaats.
De versions/ map bevat JSON-bestanden voor elk van de poorten die beschikbaar zijn in het register. Elk bestand bevat alle versies die beschikbaar zijn voor een pakket en bevat een Git tree-ish-object dat vcpkg kan uitchecken om de portfiles van die versie te verkrijgen.
Voorbeeld: zlib.json
{
"versions": [
{
"git-tree": "2dfc991c739ab9f2605c2ad91a58a7982eb15687",
"version-string": "1.2.11",
"port-version": 9
},
...
{
"git-tree": "a516e5ee220c8250f21821077d0e3dd517f02631",
"version-string": "1.2.10",
"port-version": 0
},
{
"git-tree": "3309ec82cd96d752ff890c441cb20ef49b52bf94",
"version-string": "1.2.8",
"port-version": 0
}
]
}
Voor elke poort moet het bijbehorende versiebestand zich bevinden in versions/{first letter of port name}-/{port name}.json. Het versiebestand van zlib bevindt zich bijvoorbeeld in versions/z-/zlib.json. Naast poortversiebestanden bevindt het huidige basislijnbestand zich in versions/baseline.json.