Pakketversiebeheer
Een specifiek pakket wordt altijd aangeduid met behulp van de pakket-id en een exact versienummer. Entity Framework op nuget.org heeft bijvoorbeeld enkele tientallen specifieke pakketten beschikbaar, variërend van versie 4.1.10311 tot versie 6.1.3 (de nieuwste stabiele release) en een verscheidenheid aan voorlopige versies, zoals 6.2.0-beta1.
Wanneer u een pakket maakt, wijst u een specifiek versienummer toe met een optioneel voorvoegsel voor de tekst van de voorlopige versie. Wanneer u pakketten gebruikt, kunt u daarentegen een exact versienummer of een bereik van acceptabele versies opgeven.
Het volgende document volgt de Semantic Versioning 2.0.0 standard, ondersteund door NuGet 4.3.0+ en Visual Studio 2017 versie 15.3+. Bepaalde semantiek van SemVer v2.0.0 worden niet ondersteund in oudere clients.
In dit onderwerp:
- basisbeginselen van de versie inclusief voorvoegsels van de voorlopige versie.
- versiebereiken
- genormaliseerde versienummers
- Semantic Versioning 2.0.0
Basisbeginselen van versies
Een specifiek versienummer heeft de vorm Major.Minor.Patch[-Suffix], waarbij de onderdelen de volgende betekenissen hebben:
- primaire: belangrijke wijzigingen
- secundaire: nieuwe functies, maar compatibel met eerdere versies
- Patch: alleen oplossingen voor achterwaartse fouten
- -Achtervoegsel (optioneel): een afbreekstreepje gevolgd door een tekenreeks die een voorlopige versie aangeeft (na de Semantische versiebeheer of SemVer conventie).
voorbeelden:
1.0.1
6.11.1231
4.3.1-rc
2.2.44-beta.1
Belangrijk
nuget.org weigert alle pakketuploads die geen exact versienummer hebben. De versie moet worden opgegeven in het .nuspec
- of projectbestand dat wordt gebruikt om het pakket te maken.
Pre-releaseversies
Technisch gesproken kunnen pakketmakers elke tekenreeks als achtervoegsel gebruiken om een voorlopige versie aan te geven, omdat NuGet een dergelijke versie als voorlopige versie behandelt en geen andere interpretatie geeft. Dat wil zeggen dat NuGet de volledige versietekenreeks weergeeft in elke gebruikersinterface die elke interpretatie van de betekenis van het achtervoegsel aan de consument overlaat.
Dat gezegd hebbende, volgen pakketontwikkelaars in het algemeen herkende naamconventies:
-
-alpha
: Alpha-release, die doorgaans wordt gebruikt voor werk in uitvoering en experimenten. -
-beta
: bètarelease, meestal een versie die volledig is voor de volgende geplande release, maar kan bekende bugs bevatten. -
-rc
: Releasekandidaat, meestal een release die mogelijk definitief (stabiel) is, tenzij er aanzienlijke bugs optreden.
Als u versies rangschikt op prioriteit, volgt NuGet de SemVer-standaard en kiest u eerst een versie zonder achtervoegsel. Vervolgens wordt prioriteit toegepast op voorlopige versies in omgekeerde alfabetische volgorde en worden punt notatienummers met numerieke volgorde behandeld.
Notitie
Prereleasenummers met puntnotatie, zoals in 1.0.1-build.23, worden beschouwd als onderdeel van de SemVer 2.0.0 standaard, en daarom worden alleen ondersteund met NuGet 4.3.0+.
1.0.1
1.0.1-zzz
1.0.1-rc.10
1.0.1-rc.2
1.0.1-open
1.0.1-beta
1.0.1-alpha2
1.0.1-alpha10
1.0.1-aaa
Houd er rekening mee dat 1.0.1-alfa10 strikt in omgekeerde alfabetische volgorde wordt gesorteerd, terwijl 1.0.1-rc.10 een hogere prioriteit heeft dan 1.0.1-rc.2.
Versiebereiken
Als u verwijst naar pakketafhankelijkheden, ondersteunt NuGet het gebruik van interval notatie voor het opgeven van versiebereiken, samengevat als volgt:
Notatie | Toegepaste regel | Beschrijving |
---|---|---|
1.0 | x ≥ 1,0 | Minimale versie, inclusief |
[1.0,) | x ≥ 1,0 | Minimale versie, inclusief |
(1.0,) | x > 1,0 | Minimale versie, exclusief |
[1.0] | x == 1,0 | Exacte versieovereenkomst |
(,1.0] | x ≤ 1,0 | Maximale versie, inclusief |
(,1.0) | x < 1,0 | Maximale versie, exclusief |
[1.0,2.0] | 1,0 ≤ x ≤ 2,0 | Exact bereik, inclusief |
(1.0,2.0) | 1,0 < x < 2,0 | Exact bereik, exclusief |
[1.0,2.0) | 1,0 ≤ x < 2,0 | Gemengde inclusief minimum- en exclusieve maximumversie |
(1.0) | Ongeldig | Ongeldig |
Aanbevolen procedure
Geef altijd een versie- of versiebereik op voor pakketafhankelijkheden in projectbestanden, packages.config
bestanden en .nuspec
bestanden. Zonder een versie- of versiebereik wordt bij het oplossen van een afhankelijkheid geen consistente herstelresultaten gegarandeerd.
Vermijd het opgeven van een bovengrens voor versiebereiken voor pakketten waarvan u niet de eigenaar bent, tenzij u bekend bent met een compatibiliteitsprobleem. Bovengrens voor versiebereiken kan de acceptatie van versies schaden, consumenten ontmoedigen om waardevolle updates voor afhankelijkheden te krijgen en in sommige gevallen kunnen ze leiden tot het gebruik van niet-ondersteunde versies van afhankelijkheden.
Verwijzingen in projectbestanden (PackageReference)
<!-- Accepts any version 6.1 and above.
Will resolve to the smallest acceptable stable version.-->
<PackageReference Include="ExamplePackage" Version="6.1" />
<!-- Accepts any 6.x.y version.
Will resolve to the highest acceptable stable version.-->
<PackageReference Include="ExamplePackage" Version="6.*" />
<!-- Accepts any version above, but not including 4.1.3. Could be
used to guarantee a dependency with a specific bug fix.
Will resolve to the smallest acceptable stable version.-->
<PackageReference Include="ExamplePackage" Version="(4.1.3,)" />
<!-- Accepts any version up below 5.x, which might be used to prevent pulling in a later
version of a dependency that changed its interface. However, this form is not
recommended because it can be difficult to determine the lowest version.
Will resolve to the smallest acceptable stable version.
-->
<PackageReference Include="ExamplePackage" Version="(,5.0)" />
<!-- Accepts any 1.x or 2.x version, but not 0.x or 3.x and higher.
Will resolve to the smallest acceptable stable version.-->
<PackageReference Include="ExamplePackage" Version="[1,3)" />
<!-- Accepts 1.3.2 up to 1.4.x, but not 1.5 and higher.
Will resolve to the smallest acceptable stable version. -->
<PackageReference Include="ExamplePackage" Version="[1.3.2,1.5)" />
Verwijzingen in packages.config
:
In packages.config
wordt elke afhankelijkheid weergegeven met een exact version
kenmerk dat wordt gebruikt bij het herstellen van pakketten. Het kenmerk allowedVersions
wordt alleen gebruikt tijdens updatebewerkingen om de versies te beperken waarop het pakket kan worden bijgewerkt.
<!-- Install/restore version 6.1.0, accept any version 6.1.0 and above on update. -->
<package id="ExamplePackage" version="6.1.0" allowedVersions="6.1.0" />
<!-- Install/restore version 6.1.0, and do not change during update. -->
<package id="ExamplePackage" version="6.1.0" allowedVersions="[6.1.0]" />
<!-- Install/restore version 6.1.0, accept any 6.x version during update. -->
<package id="ExamplePackage" version="6.1.0" allowedVersions="[6,7)" />
<!-- Install/restore version 4.1.4, accept any version above, but not including, 4.1.3.
Could be used to guarantee a dependency with a specific bug fix. -->
<package id="ExamplePackage" version="4.1.4" allowedVersions="(4.1.3,)" />
<!-- Install/restore version 3.1.2, accept any version up below 5.x on update, which might be
used to prevent pulling in a later version of a dependency that changed its interface.
However, this form is not recommended because it can be difficult to determine the lowest version. -->
<package id="ExamplePackage" version="3.1.2" allowedVersions="(,5.0)" />
<!-- Install/restore version 1.1.4, accept any 1.x or 2.x version on update, but not
0.x or 3.x and higher. -->
<package id="ExamplePackage" version="1.1.4" allowedVersions="[1,3)" />
<!-- Install/restore version 1.3.5, accepts 1.3.2 up to 1.4.x on update, but not 1.5 and higher. -->
<package id="ExamplePackage" version="1.3.5" allowedVersions="[1.3.2,1.5)" />
verwijzingen in .nuspec
bestanden
Het kenmerk version
in een <dependency>
element beschrijft de bereikversies die acceptabel zijn voor een afhankelijkheid.
<!-- Accepts any version 6.1 and above. -->
<dependency id="ExamplePackage" version="6.1" />
<!-- Accepts any version above, but not including 4.1.3. Could be
used to guarantee a dependency with a specific bug fix. -->
<dependency id="ExamplePackage" version="(4.1.3,)" />
<!-- Accepts any version up below 5.x, which might be used to prevent pulling in a later
version of a dependency that changed its interface. However, this form is not
recommended because it can be difficult to determine the lowest version. -->
<dependency id="ExamplePackage" version="(,5.0)" />
<!-- Accepts any 1.x or 2.x version, but not 0.x or 3.x and higher. -->
<dependency id="ExamplePackage" version="[1,3)" />
<!-- Accepts 1.3.2 up to 1.4.x, but not 1.5 and higher. -->
<dependency id="ExamplePackage" version="[1.3.2,1.5)" />
Genormaliseerde versienummers
Notitie
Dit is een belangrijke wijziging voor NuGet 3.4+.
Wanneer u pakketten uit een opslagplaats verkrijgt tijdens installatie-, opnieuw- of herstelbewerkingen, behandelt NuGet 3.4+ versienummers als volgt:
Voorloopnullen worden verwijderd uit versienummers:
- 1.00 wordt behandeld als 1,0
- 1.01.1 wordt behandeld als 1.1.1
- 1.00.0.1 wordt behandeld als 1.0.0.1
Een nul in het vierde deel van het versienummer wordt weggelaten
- 1.0.0.0 wordt behandeld als 1.0.0
- 1.0.01.0 wordt behandeld als 1.0.1
Metagegevens van de build van SemVer 2.0.0 worden verwijderd
- 1.0.7+r3456 wordt behandeld als 1.0.7
pack
en restore
normaliseren waar mogelijk versies. Voor pakketten die al zijn gebouwd, heeft deze normalisatie geen invloed op de versienummers in de pakketten zelf; dit is alleen van invloed op hoe NuGet overeenkomt met versies bij het oplossen van afhankelijkheden.
NuGet-pakketopslagplaatsen moeten deze waarden echter op dezelfde manier behandelen als NuGet om duplicatie van pakketversies te voorkomen. Een opslagplaats met versie 1.0 van een pakket mag dus niet ook versie 1.0.0 hosten als een afzonderlijk en ander pakket.
Semantische versiebeheer 2.0.0
Bepaalde semantiek van SemVer v2.0.0 wordt niet ondersteund in oudere clients. NuGet beschouwt een pakketversie als SemVer v2.0.0 specifiek als een van de volgende instructies waar is:
- Het label vóór release is gescheiden door puntjes, bijvoorbeeld 1.0.0-alpha.1
- De versie bevat build-metadata, bijvoorbeeld 1.0.0+githash
Voor nuget.org wordt een pakket gedefinieerd als een SemVer v2.0.0-pakket als een van de volgende instructies waar is:
- De eigen versie van het pakket is SemVer v2.0.0-compatibel, maar niet SemVer v1.0.0-compatibel, zoals hierboven is gedefinieerd.
- Een van de afhankelijkheidsversiebereiken van het pakket heeft een minimale of maximale versie die compatibel is met SemVer v2.0.0, maar niet met SemVer v1.0.0, zoals hierboven is gedefinieerd; bijvoorbeeld [1.0.0-alpha.1, ).
Als u een SemVer v2.0.0-specifiek pakket uploadt naar nuget.org, is het pakket onzichtbaar voor oudere clients en alleen beschikbaar voor de volgende NuGet-clients:
- NuGet 4.3.0+
- Visual Studio 2017 versie 15.3+
- Visual Studio 2015 met NuGet VSIX v3.6.0
- .NET SDK 2.0.0+
Clients van derden:
- JetBrains Rider
- Paket versie 5.0+
Waarbij NuGetVersion afwijkt van Semantic Versioning
Als u NuGet-pakketversies programmatisch wilt gebruiken, is het raadzaam om het pakket NuGet.Versioningte gebruiken. De statische methode NuGetVersion.Parse(string)
kan worden gebruikt om de versietekenreeksen te parseren en VersionComparer
kan worden gebruikt om NuGetVersion
exemplaren te sorteren.
Als u NuGet-functionaliteit implementeert in een taal die niet wordt uitgevoerd op .NET, vindt u hier de bekende lijst met verschillen tussen NuGetVersion
en Semantische versiebeheer, en de redenen waarom een bestaande Semantische versiebeheerbibliotheek mogelijk niet werkt voor pakketten die al op nuget.org zijn gepubliceerd.
-
NuGetVersion
ondersteunt een 4e versiesegment,Revision
, om compatibel te zijn met, of een superset van,System.Version
. Daarom wordt een versietekenreeksMajor.Minor.Patch.Revision
, met uitzondering van prerelease- en metagegevenslabels. AlsRevision
nul is, wordt deze volgens de hierboven beschreven versienormalisatie weggelaten uit de genormaliseerde versietekenreeks. -
NuGetVersion
hoeft alleen het primaire segment te worden gedefinieerd. Alle andere zijn optioneel en zijn gelijk aan nul. Dit betekent dat1
,1.0
,1.0.0
en1.0.0.0
allemaal worden geaccepteerd en gelijk zijn. -
NuGetVersion
maakt gebruik van niet-hoofdlettergevoelige tekenreeksvergelijkingen voor pre-release-onderdelen. Dit betekent dat1.0.0-alpha
en1.0.0-Alpha
gelijk zijn.