WhichDistroSharp 1.0.1
dotnet add package WhichDistroSharp --version 1.0.1
NuGet\Install-Package WhichDistroSharp -Version 1.0.1
<PackageReference Include="WhichDistroSharp" Version="1.0.1" />
<PackageVersion Include="WhichDistroSharp" Version="1.0.1" />
<PackageReference Include="WhichDistroSharp" />
paket add WhichDistroSharp --version 1.0.1
#r "nuget: WhichDistroSharp, 1.0.1"
#:package WhichDistroSharp@1.0.1
#addin nuget:?package=WhichDistroSharp&version=1.0.1
#tool nuget:?package=WhichDistroSharp&version=1.0.1
WhichDistroSharp is a unofficial .NET wrapper for Which-Distro's os-release archive, allowing for easy platform detection in just one LoC!
See the CHANGELOG.md for what changed in each release.
Supported Distros
For a list of supported distos, click here
Basic Usage (Detects distro name only)
using WhichDistroSharp;
using static WhichDistroSharp.WhichDistroSharp;
// Distro detection
Distro distro = Detect();
Console.WriteLine($"Detected Distro: {distro}");
Console.WriteLine($"Was Found: {distro.WasFound()}");
Advanced Usage (Detects distro and os-release info)
using WhichDistroSharp;
using static WhichDistroSharp.WhichDistroSharp;
// Detecting the current distro.
Distro distro = Detect();
if (!distro.WasFound()) {
Console.Error.WriteLine("Failed to detect the linux distro running on the current machine");
Environment.Exit(1);
}
Console.WriteLine($"Detected Distro: {distro}");
Console.WriteLine($"Was Found: {distro.WasFound()}");
Console.WriteLine();
// Each distro object has source generated Is* methods, where * represents a distro name.
Console.WriteLine($"Is Linux Mint: {distro.IsLinuxmint()}");
Console.WriteLine($"Is Ubuntu: {distro.IsUbuntu()}");
Console.WriteLine($"Is Ubuntu: {distro.IsDebian()}");
Console.WriteLine($"Is Fedora: {distro.IsFedora()}");
Console.WriteLine($"Is Raspbian: {distro.IsRaspbian()}");
Console.WriteLine();
// Method 1: Parsing the /etc/os-release file for the current distro.
IOsRelease? info = OsReleaseInfo.GetInfo(distro);
if (info == null) {
Console.Error.WriteLine("Failed to detect the os-release information for the distro running on the current machine");
Environment.Exit(1);
}
// Displaying OS Release info
Console.WriteLine($"OS Release Info:");
Console.WriteLine($" Name: {info.NAME}");
Console.WriteLine($" Version: {info.VERSION_ID}");
Console.WriteLine($" Pretty Name: {info.PRETTY_NAME}");
// Method 2: Parsing /etc/os-release without specifying a distro.
// This is mostly used for debugging purposes, although it may fit your specific needs.
IPlatform platform = DetectPlatform();
Console.WriteLine($"Name: {platform.Name}");
Console.WriteLine($"ID: {platform.Id}");
Console.WriteLine($"Version: {platform.VersionId}");
Console.WriteLine($"Pretty Name: {platform.PrettyName}");
Console.WriteLine();
Package managers
Distros/package-managers.json serves as the source of truth for all build operations. This file will be updated by hand due to a variety of edge cases, including, but not limited to:
arch/archandgentoo/gentoodeclaring noID_LIKEvalue, therefore deriving their family from the upstream archive would be impossible.centos/7andcentos/9declare the same value forID_LIKEbut declare yum and dnf respectively.
Every directory under Distros/ MUST be given an entry. Failure to do so will throw an exception (DSG006-DSG009). This also applies to a version key with no data sample, an unparseable enum, or an empty string is provided for "unknownReason".
Example:
"wolfsome": {
"packageManager": "Unknown",
"unknownReason": "no primary package manager; see the fastabi doc",
"packageType": "Unknown"
}
Reading the data
using WhichDistroSharp;
static void WritePackages(IDistroPackageInfo? packages, string? label = null, string indent = " ")
{
if (label != null) {
Console.WriteLine($"{indent}{label}:");
}
if (packages == null) {
Console.WriteLine($"{indent} no data found in upstream");
return;
}
Console.WriteLine($"{indent} manager: {packages.PackageManager}");
Console.WriteLine($"{indent} family: {packages.Family}");
Console.WriteLine($"{indent} install: {packages.PackageManagerCommand} {packages.InstallCommand}");
Console.WriteLine($"{indent} remove: {packages.PackageManagerCommand} {packages.UninstallCommand}");
Console.WriteLine($"{indent} query: {packages.QueryCommand} {packages.QueryArguments}");
// Only dpkg needs a keyword for confirmation.
// The process exits with code 0 for a package that is known but not installed.
Console.WriteLine($"{indent} keyword: {(packages.InstallKeyword is null ? "(none)" : $"\"{packages.InstallKeyword}\"")}");
Console.WriteLine($"{indent} format: {packages.PackageType.GetPackageFileType()}");
Console.WriteLine();
}
// Most functions can be called with a single Distro parameter.
// Ubuntu package manager example
IDistroPackageInfo? UbuntuPackageInfo = PackageManagerInfo.GetInfo(Distro.Ubuntu);
if (UbuntuPackageInfo != null) {
WritePackages(UbuntuPackageInfo, "Ubuntu package manager example");
}
// Some distros change manager between major versions, so the answer is version aware.
IDistroPackageInfo? centos7PackageInfo = PackageManagerInfo.GetInfo(Distro.Centos, "7"); // yum
IDistroPackageInfo? centos9PackageInfo = PackageManagerInfo.GetInfo(Distro.Centos, "9"); // dnf
if (centos7PackageInfo != null) {
WritePackages(centos7PackageInfo, "CentOS 7 package manager example");
}
else if (centos9PackageInfo != null) {
WritePackages(centos9PackageInfo, "CentOS 9 package manager example");
}
// A constant representing a distro that was not present in the os-release upstream archive.
IDistroPackageInfo nothing = PackageManagerInfo.Unknown;
// If a distro is not included in the upstream os-release archive, this fails loudly instead of spawning a process named "unknown".
WritePackages(nothing, label: "Example of an unresolved distro");
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
-
net6.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.