Concepten voor registers
Overzicht
vcpkg host een selectie van bibliotheken die zijn verpakt in poorten op https://github.com/Microsoft/vcpkg. Deze verzameling poorten wordt het gecureerde registergenoemd. Vcpkg is echter niet beperkt tot het gecureerde register. Gebruikers kunnen de selectie van poorten uitbreiden door aangepaste registers te maken.
Een register is een verzameling poorten en helperbestanden die in een specifieke structuur zijn gerangschikt. Door de registerstructuur te volgen, kunnen poorten in een register worden geïnstalleerd met dezelfde functies (versiebeheer, binaire caching) aangeboden aan poorten in het gecureerde register.
Er zijn momenteel drie soorten registers:
vcpkg kan worden geïnstrueerd om te overwegen welke poorten beschikbaar zijn in aangepaste registers met behulp van een vcpkg-configuration.json
bestand. Zie het artikel Zelfstudie: Een afhankelijkheid van een Git-register installeren voor een handleiding over het gebruik van aangepaste registers in uw projecten.
Registerstructuur
Om vcpkg te laten interfacen met een register, moet deze voldoen aan de volgende structuur:
- Een map met de naam
ports
bevat de verzameling poorten, waarbij elke submap een specifieke poort bevat die overeenkomt met de naam van de submap. De bestanden voor poortfoo
bevinden zich bijvoorbeeld inports/foo
. - Een map met de naam
versions
bevat de bestanden die bestaan uit de versiesdatabase.
Voorbeeld: registerstructuur
ports/
foo/
portfile.cmake
vcpkg.json
versions/
f-/
foo.json
baseline.json
Versiesdatabase
Alle registers bevatten een versions
map in de basisdirectory van het register die de database versiesbevat.
Er zijn twee onderdelen voor de versiesdatabase:
- Het basislijnbestand
- De versiebestanden
Het basislijnbestand is een JSON-bestand met de naam baseline.json
dat zich in de hoofdmap van de map versions
bevindt.
De versiesbestanden zijn JSON-bestanden met dezelfde namen als de beschikbare poorten.
Ze moeten bestaan op versions/<prefix>/<port name>.json
, waarbij <prefix>
de eerste letter van de poortnaam is, gevolgd door een afbreekstreepje. Bijvoorbeeld, het versiebestand voor poort foo
moet zich op versions/f-/foo.json
bevinden.
Het doel van het versiebestand is tweeledig.
- Alle beschikbare versies van elke poort weergeven
- Wijs de ophaallocaties van elke versie aan.
De indeling van het versiebestand is afhankelijk van het type register.
Basislijnbestand
Alle registers, ongeacht hun soort, moeten een bestand met de naam baseline.json
in versions/baseline.json
bevatten.
Het doel van het basislijnbestand is om de set versies te beschrijven die als de meest recente worden beschouwd voor alle poorten in het register. Er wordt verwacht dat dit bestand wordt bijgewerkt telkens wanneer een nieuwe versie van een poort wordt toegevoegd aan het register.
Het bestand is een JSON-bestand dat bestaat uit één object waarvan de eigenschappen de naam basislijnobjecten hebben. De eigenschappen van elk basislijnobject zijn poortnamen, waarvan de waarden versievermeldingen zijn. In het naslaginformatie over registers artikel wordt de indeling van basislijnbestanden uitgebreider beschreven.
Elke vermelding van de basislijnversie is een object met de volgende eigenschappen:
-
baseline
: de waarde is de versie van de poort die overeenkomt met het bijbehorendevcpkg.json
-bestand. -
port-version
: de waarde is deport-version
van de poort die overeenkomt met het bijbehorendevcpkg.json
-bestand.
Voorbeeld van basislijnbestand
{
"default": {
"foo": { "baseline": "1.0.0", "port-version": 0 },
"bar": { "baseline": "2024-08-01", "port-version": 1 },
"baz": { "baseline": "vista-xp", "port-version": 0 }
}
}
Raadpleeg de referentiedocumentatie voor:
- Indeling van basislijnbestand voor Git-registers
- Indeling van basislijnbestanden voor bestandssysteemregisters
Versiesbestanden
Elke poort in het register heeft een bijbehorend versiebestand.
Versiesbestanden worden opgeslagen op versions/<prefix>/<port name>.json
, waarbij <prefix>
de eerste letter van de poortnaam is, gevolgd door een afbreekstreepje. Het versiebestand voor poort foo
bevindt zich bijvoorbeeld op versions/f-/foo.json
.
Het doel van het versiebestand is tweeledig.
- Alle beschikbare versies van elke poort weergeven
- Wijs de ophaallocaties van elk van deze versies aan
De indeling van het versiebestand is een object met een "versions"
matrix, waarbij elke vermelding in die matrix een versieobject is. Een versieobject moet de volgende eigenschappen bevatten:
- Een versie-eigenschap: de sleutel en waarde van de eigenschap moeten overeenkomen met de sleutel en waarde die worden gebruikt door de poort in het
vcpkg.json
bestand. De sleutel moet een vanversion
,version-semver
,version-date
ofversion-string
zijn ; de waarde moet de versie zijn zoals deze wordt weergegeven in het manifestbestand van de poort (vcpkg.json
). -
port-version
: de waarde is deport-version
van de poort, zoals deze wordt weergegeven in hetvcpkg.json
-bestand van de poort. -
git-tree
: (alleen in Git-registraties) is de waarde de git-tree SHA die overeenkomt met de map van de poort. Dit is een SHA die wordt berekend door de inhoud van de map van de poort te hashen; deze git-tree SHA kan door Git worden gebruikt om de inhoud van de poort op te halen die overeenkomt met de opgegeven git-tree. Hierdoor kan vcpkg oude versies van poorten ophalen uit de Git-geschiedenis van registers. Lees de sectie git-registers voor meer informatie over het verkrijgen van deze waarde voor een bepaalde poortversie. -
path
: (alleen in bestandssysteemregisters) is de waarde het volledige pad naar een map met de poortbestanden voor de specifieke versie.
Voorbeeld van een bestandssysteemregisterversiebestand
{
"versions": [
{
"path": "$/ports/foo/1.2.0",
"version": "1.2.0",
"port-version": 0
},
{
"path": "$/ports/foo/1.1.0",
"version": "1.1.0",
"port-version": 0
},
{
"path": "$/ports/foo/1.0.0",
"version": "1.0.0",
"port-version": 0
}
]
}
Raadpleeg de referentiedocumentatie voor:
- Indeling van versiebestanden voor Git-repositories
- Indeling van versiebestanden voor bestandssysteemregisters
Ingebouwd register
Het ingebouwde register is een speciaal type register. Het is het standaardregister dat wordt gebruikt in klassieke modus. In manifestmodus, wanneer een standaardregister niet is opgegeven, maakt vcpkg impliciet gebruik van het ingebouwde register.
Het ingebouwde register verwijst naar de lokale kopie van het gecureerde register dat is gemaakt wanneer u de vcpkg-opslagplaats van https://github.com/Microsoft/vcpkggit clone
. Sommige bewerkingen verwachten dat de VCPKG_ROOT
omgevingsvariabele verwijst naar een ingebouwd register.
Als vcpkg wordt verkregen via de "one-liner" of het Visual Studio-installatieprogramma, wordt het ingebouwde register gelijk aan een Git-register, dat naar de https://github.com/Microsoft/vcpkg opslagplaats verwijst.
Git-registries
Een Git-register is een opslagplaats die de registerstructuur volgt en gebruikmaakt van de mogelijkheden van Git om versiebeheer voor de poorten in het register te bieden. Het gecureerde register op https://github.com/Microsoft/vcpkg is een implementatie van een Git-register.
Git-registers kunnen worden gehost in elke Git-opslagplaatsprovider, zodat u de door u gekozen Git-hostingservice kunt gebruiken om de toegang tot uw aangepaste register te beheren en uw register ook eenvoudig te delen.
Git-registers zijn de aanbevolen methode voor het implementeren van een aangepast register.
Omdat het versiebeheermechanisme hetzelfde is dat wordt gebruikt door het gecureerde register, kunnen Git-registers gebruikmaken van de x-add-version
om uw versiedatabasebestanden te beheren.
Zie de registerreferentie voor implementatiedetails van Git-registries.
Een nieuwe versie toevoegen aan een Git-register
De opdracht x-add-version
kan worden gebruikt om een nieuwe poort of een nieuwe versie aan het register toe te voegen. Wanneer u versies toevoegt met deze opdracht, moet u rekening houden met een aantal dingen:
Belangrijk
Wanneer u een nieuwe versie toevoegt, moet u altijd de gedeclareerde versie van de poort bijwerken naar een versie die nog niet is gepubliceerd, om te voorkomen dat de versiegeschiedenis opnieuw wordt geschreven.
Wanneer u wijzigingen aanbrengt in een poort, moet de eerste stap zijn om de versie in het vcpkg.json
-bestand te verhogen. Als uw wijzigingen een update bevatten van de upstream- versie van het pakket, moet u de port-version
instellen op 0
; vergeet niet om de port-version
met één te verhogen.
De x-add-version
opdracht vereist dat al uw poortwijzigingen worden doorgevoerd in de opslagplaats voordat u de versiedatabase bijwerkt.
Voorbeeld: een nieuwe poortversie toevoegen aan een Git-register
git add ports/foo/.
git commit -m "Temporary commit"
vcpkg x-add-version --x-builtin-ports-root=./ports --x-builtin-registry-versions-dir=./versions foo
added version 1.0.0#1 to path/to/registry/versions/f-/foo.json
added version 1.0.0#1 to path/to/registry/versions/baseline.json
De omleidingsopties --x-builtin-ports-root
en --x-builtin-registry-versions-dir
moeten respectievelijk verwijzen naar de ports
en versions
mappen van uw register.
Zodra de opdracht x-add-version
succesvol wordt uitgevoerd, wijzigt u de laatste commit om de versiebestandswijzigingen op te nemen.
git commit --amend -m "Update foo to new version"
Bestandssysteemregisters
Bestandssysteemregisters zijn een implementatie van een register dat zich op een bestandssysteem bevindt. Ze volgen de algemene registerstructuur, maar maken geen gebruik van Git om versiebeheermogelijkheden te bieden. In plaats daarvan gebruiken ze een primitieve vorm van versiebeheer met behulp van een uniek pad voor elke versie van de poorten.
Dit type register is geschikt als testbasis voor uw poorten of om een alternatief te bieden voor een register in een niet-Git-versiebeheersysteem. Bestandssysteemregisters worden niet aanbevolen voor een grote verzameling poorten en er is geen hulpprogramma's beschikbaar om de versiedatabasebestanden voor dit type register te bewerken.
Zie de naslaginformatie over registers voor meer informatie over het implementeren van een bestandssysteemregister.
Registers gebruiken
Als u een aangepast register in uw project wilt gebruiken, moet u een configuratiebestand (vcpkg-configuration.json
) maken naast het manifestbestand (vcpkg.json
)van uw project.
Standaardregister
Wanneer poortnamenoplossen, fungeert het standaardregister als terugvaloptie wanneer de naam van een poort niet overeenkomt met een van de pakketpatronen die door andere registers in de registries
arrayzijn gedeclareerd.
Als gemak voor gebruikers die niet betrokken zijn bij aangepaste registers, voegt vcpkg impliciet het ingebouwde register toe als het standaardregister. Als u dit gedrag wilt wijzigen, kan het standaardregister worden ingesteld op elk register of volledig worden uitgeschakeld met behulp van de
default-registry
eigenschap.
Voorbeeld: Een aangepast register als standaard instellen
vcpkg-configuration.json
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "84a143e4caf6b70db57f28d04c41df4a85c480fa"
}
}
Voorbeeld: Het standaardregister uitschakelen
vcpkg-configuration.json
{
"default-registry": null
}
Registersmatrix
Als u de beschikbare poorten wilt uitbreiden om te installeren met vcpkg, kunt u extra registers opgeven met behulp van de registries
matrix.
Voorbeeld: Aangepaste registers toevoegen aan de configuratie
Notitie
Afhankelijk van het registertype moet u mogelijk andere informatie opgeven in de registries
matrix. Zie de vcpkg-configurtion.json
referentie voor meer informatie over welke eigenschappen vereist zijn voor elk type register.
vcpkg-configuration.json
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "84a143e4caf6b70db57f28d04c41df4a85c480fa"
},
"registries": [
{
"kind": "git",
"repository": "https://my.privateregistry.git",
"baseline": "caf6b70db5784a143e4f28d05c480fa4c41df4a8",
"packages": [ "foo" ]
},
{
"kind": "filesystem",
"path": "C:/path/to/registry",
"baseline": "baseline1",
"packages": [ "bar" ]
}
]
}
Aanbevolen procedures voor registers
Versiegeschiedenis niet herschrijven
Zodra een versie naar de versiebestanden is gepubliceerd, mag men de bijbehorende git-tree
niet wijzigen in een Git-register of map in een bestandssysteemregister.
Een van de ontwerpprincipes van vcpkg is dat de versies van geïnstalleerde afhankelijkheden niet veranderen zonder tussenkomst van de gebruiker. Het herschrijven van de bestandsgeschiedenis van de versies door een git-tree
vermelding te wijzigen, schendt dit principe.
Als de bestaande versie problemen heeft, maakt u liever een nieuwe port-version
.
Versiesbestanden niet verwijderen
Notitie
Deze sectie is alleen van toepassing op Git-registers
Wanneer u een poort uit het register verwijdert, verwijdert u de inhoud van de poortmap en de vermelding in het basislijnbestand. Maar het bijbehorende versiebestand niet verwijderen.
Zelfs als er geen poort meer in het register bestaat, kunnen gebruikers van de poort oude versies installeren met behulp van versie overrides
.
Volgende stappen
Hier volgen enkele taken om het volgende te proberen: