semver .NET Library

repository·master·Indexed 43 days ago

https://github.com/walkercoderanger/semver

A v2.0.0 compliant Semantic Version library for .NET providing tools to create, parse, compare, and manipulate semantic version numbers and version ranges. Supports .NET Standard 2.0, 2.1, and .NET 5+. Features include NPM-style range parsing via SemVersionRange, precedence and sort order comparison, and support for prerelease identifiers.

Tokens
2.2K
Snippets
11
Records
12
Agent score
56%

What's inside semver

  1. Check framework compatibility for SemVer

    master

    As of v3.0.0, the semver package is multi-targeted to support a wide range of .NET environments. You can use this package in projects targeting:

    • .NET Standard 2.0: For compatibility with older .NET Framework versions (e.g., 4.6.1 through 4.8.X) and projects requiring serialization support.
    • .NET Standard 2.1: For projects that want to benefit from C# 8.0 features, specifically nullable reference types, allowing the package to provide better type information regarding nullability.
    • .NET 5+: For modern .NET applications. Targeting .NET 5 directly allows the package to use the built-in MemberNotNullWhenAttribute for improved null handling in range types without the overhead of external dependency types used in older versions.
  2. Sort and find Max/Min of SemVersion collections

    master

    When sorting collections of versions or using LINQ Max/Min, you must specify which comparison logic to use via a comparer:

    • SemVersion.SortOrderComparer: For full sort order comparison.
    • SemVersion.PrecedenceComparer: For precedence-based comparison.

    Example of sorting a list and finding the maximum version:

    var examples = new List<Example> { ... };
    // Put in sort order
    var sorted = examples.OrderBy(e => e.Version, SemVersion.SortOrderComparer);
    // Order by precedence, then by release date
    var ordered = examples.OrderBy(e => e.Version, SemVersion.PrecedenceComparer)
                          .ThenBy(e => e.Released);
    
    var versions = new List<SemVersion> { vNextRc, v1 };
    var max = versions.Max(SemVersion.SortOrderComparer);
    console.WriteLine($"Max version is {max}");
  3. Manipulate SemVersion properties

    master

    You can inspect and transform SemVersion objects using properties like IsPrerelease and Prerelease, or methods like WithoutPrereleaseOrMetadata() to strip specific components.

    Console.WriteLine($"Current: {version}");
    if (version.IsPrerelease)
    {
        Console.WriteLine($"Prerelease: {version.Prerelease}");
        Console.WriteLine($"Next release version is: {version.WithoutPrereleaseOrMetadata()}");
    }
  4. Use SemVersionRange to check version compatibility

    master

    The SemVersionRange class allows you to parse version ranges (including NPM-style ranges) and check if a SemVersion satisfies them.

    Key methods:

    • SemVersionRange.Parse(string range): Parses a standard range.
    • SemVersionRange.ParseNpm(string range, bool includeAllPrerelease): Parses an NPM-style range.
    • range.Contains(version): Checks if a version is within the range.
    • version.Satisfies(range): An alternative way to check if a version satisfies a range.
    • version.SatisfiesNpm(string range, bool includeAllPrerelease): Checks satisfaction against an NPM range string directly (note: this is slower as it parses the range on every call).
    var range = SemVersionRange.Parse("^1.0.0");
    var prereleaseRange = SemVersionRange.ParseNpm("^1.0.0", includeAllPrerelease: true);
    Console.WriteLine($"Range: {range}");
    Console.WriteLine($"Prerelease range: {prereleaseRange}");
    Console.WriteLine($"Range includes version {version}: {range.Contains(version)}");
    Console.WriteLine($"Prerelease range includes version {version}: {prereleaseRange.Contains(version)}");
    
    // Alternative: another way to call SemVersionRange.Contains(version)
    version.Satisfies(range);
    
    // Alternative: slower because it parses the range on every call
    version.SatisfiesNpm("^1.0.0", includeAllPrerelease: true)
  5. Parse semantic versions with SemVersion.Parse

    master

    Use SemVersion.Parse to convert a version string into a SemVersion object. You can specify a parsing style, such as SemVersionStyles.Strict, to control how the string is interpreted.

    var version = SemVersion.Parse("1.1.0-rc.1+e471d15", SemVersionStyles.Strict);
  6. Compare precedence and sort order of SemVersion

    master

    The library provides two ways to compare versions:

    1. ComparePrecedenceTo: Compares the precedence of two versions (ignoring metadata).
    2. CompareSortOrderTo: Compares the full sort order (including metadata).

    Use these methods to determine if versions have equal precedence or to check their relative sort order.

    if (version.ComparePrecedenceTo(vNextRc) == 0)
        Console.WriteLine($"{version} has the same precedence as {vNextRc}");
    
    if (version.CompareSortOrderTo(vNextRc) > 0)
        Console.WriteLine($"{version} sorts after {vNextRc}");
  7. Construct SemVersion objects

    master

    You can create SemVersion instances using the constructor for basic versions or SemVersion.ParsedFrom for more detailed construction including prerelease identifiers.

    var v1 = new SemVersion(1, 0);
    var vNextRc = SemVersion.ParsedFrom(1, 1, 0, "rc.1");
  8. Compare SemVersion precedence and sort order

    master

    Use ComparePrecedenceTo to check if two versions have equal precedence, or CompareSortOrderTo to determine if one version sorts after another.

    // Check if precedence is equal
    if (version.ComparePrecedenceTo(vNextRc) == 0)
        // ...
    
    // Check sort order
    if (version.CompareSortOrderTo(vNextRc) > 0)
        // ...
  9. Parse and use SemVersionRange

    master

    Use SemVersionRange.Parse to create a range object. You can also use SemVersionRange.ParseNpm to parse ranges using NPM-style syntax. To check if a version satisfies a range, use range.Contains(version) or the extension method version.Satisfies(range).

    // Standard parsing
    var range = SemVersionRange.Parse("^1.0.0");
    
    // NPM-style parsing with pre-release support
    var prereleaseRange = SemVersionRange.ParseNpm("^1.0.0", includeAllPrerelease: true);
    
    // Check satisfaction
    bool isIncluded = range.Contains(version);
    // OR
    bool satisfies = version.Satisfies(range);
  10. Check version satisfaction via NPM syntax

    master

    For a quick check without manually creating a range object, you can use the SatisfiesNpm method directly on a SemVersion instance.

    // Note: This parses the range string on every call and is slower than using a pre-parsed range object
    bool satisfies = version.SatisfiesNpm("^1.0.0", includeAllPrerelease: true);
  11. Construct a SemVersion object

    master

    You can create SemVersion instances using the constructor for major/minor versions, or use SemVersion.ParsedFrom to include pre-release identifiers.

    // Major and Minor only
    var v1 = new SemVersion(1, 0);
    
    // Including pre-release identifiers
    var vNextRc = SemVersion.ParsedFrom(1, 1, 0, "rc.1");