https://github.com/walkercoderanger/semver
A semantic version library for .NET fully compliant with v2.0.0 of the spec found at http://semver.org/.
https://github.com/walkercoderanger/semver
Last synced: 11 months ago
JSON representation
A semantic version library for .NET fully compliant with v2.0.0 of the spec found at http://semver.org/.
- Host: GitHub
- URL: https://github.com/walkercoderanger/semver
- Owner: WalkerCodeRanger
- License: mit
- Created: 2013-01-09T16:05:06.000Z (about 13 years ago)
- Default Branch: master
- Last Pushed: 2025-04-05T22:25:02.000Z (11 months ago)
- Last Synced: 2025-04-07T02:01:40.607Z (11 months ago)
- Language: C#
- Homepage:
- Size: 980 KB
- Stars: 310
- Watchers: 12
- Forks: 47
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: License.txt
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README
[](https://ci.appveyor.com/project/semvernuget/semver)
[](https://www.nuget.org/packages/semver/)
A Semantic Version Library for .NET
===================================
Create, parse, and manipulate semantic version numbers with the `SemVersion` class and semantic
version ranges with the `SemVersionRange` class. This library complies with v2.0.0 of the semantic
versioning spec from [semver.org](http://semver.org).
API docs for the most recent release are available online at [semver-nuget.org](https://semver-nuget.org/).
## Parsing
```csharp
var version = SemVersion.Parse("1.1.0-rc.1+e471d15", SemVersionStyles.Strict);
```
## Constructing
```csharp
var v1 = new SemVersion(1, 0);
var vNextRc = SemVersion.ParsedFrom(1, 1, 0, "rc.1");
```
## Comparing
```csharp
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}");
```
Outputs:
```text
1.1.0-rc.1+e471d15 has the same precedence as 1.1.0-rc.1
1.1.0-rc.1+e471d15 sorts after 1.1.0-rc.1
```
## Sorting and Enumerable Max/Min
Since there are two ways of comparing semantic versions, the desired comparison must be specified
when sorting or comparing.
```csharp
var examples = new List { ... };
// 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 { vNextRc, v1 };
var max = versions.Max(SemVersion.SortOrderComparer);
console.WriteLine($"Max version is {max}");
```
Outputs:
```text
Max version is 1.1.0-rc.1
```
## Manipulating
```csharp
Console.WriteLine($"Current: {version}");
if (version.IsPrerelease)
{
Console.WriteLine($"Prerelease: {version.Prerelease}");
Console.WriteLine($"Next release version is: {version.WithoutPrereleaseOrMetadata()}");
}
```
Outputs:
```text
Current: 1.1.0-rc.1+e471d15
Prerelease: rc.1
Next release version is: 1.1.0
```
## Version Ranges
```csharp
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)
```
Outputs:
```text
Range: 1.*
Prerelease range: *-* 1.*
Range includes version 1.1.0-rc.1+e471d15: False
Prerelease range includes version 1.1.0-rc.1+e471d15: True
```