Versionsreferens
Med versionshantering kan du deterministiskt kontrollera de exakta revideringar av beroenden som används av projektet inifrån manifestfilen. Versionshantering är endast tillgängligt för manifestläge användare.
Mer information om vcpkg-versionsalgoritmen och begrepp på hög nivå finns i Versionsbegrepp.
Ett exempel med kontext finns i vår guide för att komma igång med versionshantering.
Versionsscheman
Portar i vcpkg bör försöka följa versionskonventionerna som används av paketets författare. Därför bör lämpligt schema användas när du deklarerar ett pakets version.
Varje versionsschema definierar sina egna regler för vad som är en giltig versionssträng och framför allt reglerna för hur versioner ska sorteras med samma schema.
De versionsscheman som förstås av vcpkg är:
Manifestegenskap | Versionsschema |
---|---|
version |
För punktavgränsade numeriska versioner |
version-semver |
För SemVer-kompatibla versioner |
version-date |
För datum i formatet YYYY-MM-DD |
version-string |
För godtyckliga strängar |
Ett manifest får bara innehålla en versionsdeklaration.
Not
Avsiktligt jämför vcpkg inte versioner som använder olika scheman. Till exempel kan ett paket som har en version-string: 7.1.3
inte jämföras med samma paket med hjälp av version: 7.1.4
, även om konverteringen verkar uppenbar.
version
Accepterar versionssträngar som följer ett avslappnat, punktavgränsat semverliknande schema.
Versionen består logiskt av punktavgränsade (.
) numeriska avsnitt. Varje avsnitt måste innehålla ett heltalsposivt tal utan inledande nollor.
Regex-mönstret för det här versionsschemat är: (0|[1-9]\d*)(\.(0|[1-9]\d*))*
sorteringsbeteende: När du jämför två versioner jämförs varje avsnitt från vänster till höger efter deras numeriska värde tills den första skillnaden hittas. En version med den minsta uppsättningen avsnitt har företräde framför en annan med en större uppsättning avsnitt, eftersom alla deras föregående avsnitt jämförs lika.
Exempel:
0
< 0.1
< 0.1.0
< 1
< 1.0.0
< 1.0.1
< 1.1
< 2.0.0
version-semver
Accepterar versionssträngar som följer semantiska versionskonventioner enligt beskrivningen i semantisk versionsspecifikation.
sorteringsbeteende: Strängar sorteras enligt reglerna som beskrivs i specifikationen för semantisk versionshantering.
Exempel:
1.0.0-1
< 1.0.0-alpha
< 1.0.0-beta
< 1.0.0
< 1.0.1
< 1.1.0
version-date
Accepterar versionssträngar som kan parsas till ett datum efter ISO-8601-formatet YYYY-MM-DD
. Disambiguationsidentifierare tillåts i form av punktavgränsade, positiva heltalsnummer utan inledande nollor.
Det här är det rekommenderade versionsschemat för "Live at HEAD"-bibliotek som inte har etablerade versionsversioner.
Regex-mönstret för det här versionsschemat är: \d{4}-\d{2}-\d{2}(\.(0|[1-9]\d*))*
sorteringsbeteende: Strängar sorteras först efter datumdelen och sedan efter numerisk jämförelse av deras disambiguationsidentifierare. Deambiguationsidentifierare följer reglerna för det avslappnade (version
) schemat.
Exempel: 2021-01-01
<2021-01-01.1
<2021-02-01.1.2
<2021-02-01.1.3
<2021-02-01
version-string
För paket som använder versionssträngar som inte passar något av de andra schemana accepterar det de flesta godtyckliga strängar. Den #
som används för att ange portversioner tillåts inte.
sorteringsbeteende: Ingen sortering görs på själva versionssträngen. Men om strängarna matchar exakt kan deras portversioner jämföras och sorteras.
Exempel:
apple
<>orange
<>orange.2
<>orange2
watermelon#0
<watermelon#1
port-version
Portversioner spårar ändringar i paketeringsfilerna (vcpkg.json
, portfile.cmake
osv.) utan några ändringar i den överordnade biblioteksversionen.
En portversion är ett icke-negativt heltalsvärde.
Reglerna för portversioner är:
- Börja vid 0 för den ursprungliga versionen av porten,
- öka med 1 varje gång en vcpkg-specifik ändring görs i porten som inte ökar versionen av paketet,
- och återställ till 0 varje gång versionen av paketet uppdateras.
Not
vcpkg följer textformatet <version>#<port version>
. Till exempel innebär 1.2.0#2
version 1.2.0
portversion 2
. Om portversionen är 0
utelämnas #0
-suffixet (t.ex. innebär 1.2.0
version 1.2.0
portversion 0
).
sorteringsbeteende: Om två versioner jämförs lika, jämförs deras portversioner med deras numeriska värde, men lägre portversioner har företräde.
Exempel:
1.2.0
<1.2.0#1
<1.2.0#2
<1.2.0#10
2021-01-01#20
<2021-01-01.1
windows#7
<windows#8
Versionsbegränsningar
Originalplaner
Baslinjer definierar ett globalt versionsgolv för vilka versioner som ska beaktas (om de inte anges någon annanstans används den version som är associerad med baslinjen). Detta gör det möjligt för toppnivåmanifest att behålla hela grafen med beroenden up-to-date utan att behöva ange direkta "version>="
begränsningar individuellt.
Varje konfigurerat register har en associerad baslinje. För manifest som inte konfigurerar några register definierar fältet "builtin-baseline"
baslinjen för det inbyggda registret. Om ett manifest inte konfigurerar några register och inte har någon "builtin-baseline"
fungerar installationen enligt algoritmen för klassiskt läge och ignorerar all versionsinformation.
Baslinjer, liksom andra registerinställningar, ignoreras från portar som används som ett beroende. Om en lägsta version krävs under transitiv versionsmatchning bör porten använda "version>="
.
Exempel
{
"name": "project",
"version": "1.0.0",
"dependencies": ["zlib", "fmt"],
"builtin-baseline":"9fd3bd594f41afb8747e20f6ac9619f26f333cbe"
}
Om du vill lägga till en första "builtin-baseline"
använder du vcpkg x-update-baseline --add-initial-baseline
. Om du vill uppdatera baslinjer i ett manifest använder du vcpkg x-update-baseline
.
version>=
Uttrycker ett minimikrav för version version>=
-deklarationer sätter en lägre gräns för de versioner som kan användas för att uppfylla ett beroende.
Not
vcpkg väljer den lägsta versionen som matchar alla begränsningar, så en begränsning som är mindre än krävs inte.
Exempel:
{
"name": "project",
"version-semver": "1.0.0",
"dependencies": [
{ "name": "zlib", "version>=": "1.2.11#9" },
{ "name": "fmt", "version>=": "7.1.3#1" }
],
"builtin-baseline":"3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Som en del av en versionsvillkorsdeklaration kan du ange en portversion genom att lägga till suffixet #<port-version>
i föregående exempel 1.2.11#9
refererar till version 1.2.11
portversion 9
.
overrides
Att deklarera en åsidosättning tvingar vcpkg att ignorera alla andra versionsbegränsningar och använda den version som anges i åsidosättningen. Detta är användbart för att fästa exakta versioner och för att lösa versionskonflikter.
Åsidosättningar deklareras som en matris med paketversionsdeklarationer.
För att en åsidosättning ska börja gälla måste det åsidosatta paketet ingå i beroendediagrammet. Det innebär att ett beroende måste deklareras antingen av manifestet på den översta nivån eller vara en del av ett transitivt beroende.
Endast en åsidosättning kan deklareras för ett givet namn.
{
"name": "project",
"version-semver": "1.0.0",
"dependencies": [
"curl",
{ "name": "zlib", "version>=": "1.2.11#9" },
"fmt"
],
"builtin-baseline":"3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{ "name": "fmt", "version": "6.0.0" },
{ "name": "openssl", "version": "1.1.1h#3" }
]
}