xamarin-macios/dotnet/generate-workloadmanifest-j...

143 строки
6.0 KiB
Plaintext
Executable File

#!/usr/bin/env /Library/Frameworks/Mono.framework/Commands/csharp -s
// arguments are: <platform> <outputPath>
using System.IO;
using System.Xml;
var args = Args;
var expectedArgumentCount = 9;
if (args.Length != expectedArgumentCount) {
Console.WriteLine ($"Need {expectedArgumentCount} arguments, got {args.Length}");
Environment.Exit (1);
return;
}
var argumentIndex = 0;
var platform = args [argumentIndex++];
var version = args [argumentIndex++];
var net8Version = args [argumentIndex++];
var runtimeIdentifiers = args [argumentIndex++].Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var outputPath = args [argumentIndex++];
var windowsPlatforms = args [argumentIndex++].Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var hasWindows = Array.IndexOf (windowsPlatforms, platform) >= 0;
var currentApiVersion = args [argumentIndex++];
var supportedApiVersions = args [argumentIndex++].Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var versionsPropsPath = args [argumentIndex++];
var platformLowerCase = platform.ToLowerInvariant ();
var allApiVersions = new List<string> (supportedApiVersions);
allApiVersions = allApiVersions.Select (v => v.Replace ('-', '_')).ToList ();
var versionsPropsTable = File.ReadAllLines (versionsPropsPath).
Where (v => v.Count (f => f == '>') > 1).
Select (v => {
var split = v.Trim ().Split (new char [] { '<', '>', '/'}, StringSplitOptions.RemoveEmptyEntries);
var name = split [0];
var value = split [1];
return new Tuple<string, string> (name, value);
}).
ToDictionary (v => v.Item1, v => v.Item2, StringComparer.OrdinalIgnoreCase);
var failed = false;
using (TextWriter writer = new StreamWriter (outputPath)) {
writer.WriteLine ($"{{");
writer.WriteLine ($" \"version\": \"{version}\",");
writer.WriteLine ($" \"workloads\": {{");
writer.WriteLine ($" \"{platformLowerCase}\": {{");
writer.WriteLine ($" \"description\": \".NET SDK Workload for building {platform} applications.\",");
writer.WriteLine ($" \"packs\": [");
foreach (var tfm in allApiVersions) {
writer.WriteLine ($" \"Microsoft.{platform}.Sdk.{(tfm == "net8.0" ? "net8" : tfm)}\",");
}
if (hasWindows) {
foreach (var tfm in allApiVersions) {
writer.WriteLine ($" \"Microsoft.{platform}.Windows.Sdk.Aliased.{(tfm == "net8.0" ? "net8" : tfm)}\",");
}
}
writer.WriteLine ($" \"Microsoft.{platform}.Ref.{currentApiVersion}\",");
foreach (var rid in runtimeIdentifiers) {
writer.WriteLine ($" \"Microsoft.{platform}.Runtime.{rid}.{currentApiVersion}\",");
}
writer.WriteLine ($" \"Microsoft.{platform}.Templates.net9\"");
writer.WriteLine ($" ],");
writer.WriteLine ($" \"extends\": [");
if (platform == "macOS") {
writer.WriteLine ($" \"microsoft-net-runtime-mono-tooling\",");
writer.WriteLine ($" \"microsoft-net-runtime-mono-tooling-net8\",");
} else {
writer.WriteLine ($" \"microsoft-net-runtime-{platformLowerCase}\",");
writer.WriteLine ($" \"microsoft-net-runtime-{platformLowerCase}-net8\",");
}
writer.WriteLine ($" ]");
writer.WriteLine ($" }},");
writer.WriteLine ($" }},");
writer.WriteLine ($" \"packs\": {{");
foreach (var tfmVersion in allApiVersions) {
string apiVersion;
var tfm = tfmVersion;
if (tfm == currentApiVersion) {
apiVersion = version;
} else if (tfm == "net8.0") {
apiVersion = net8Version;
} else {
var propsPackageName = $"Microsoft{platform}Sdk" + tfm.Replace ("-", "").Replace (".", "") + "PackageVersion";
if (!versionsPropsTable.TryGetValue (propsPackageName, out apiVersion)) {
Console.Error.WriteLine ($"❌ Unable to find a package version for {platform}/{tfm} in {versionsPropsPath}. Package name: {propsPackageName}");
apiVersion = "?";
failed = true;
}
}
writer.WriteLine ($" \"Microsoft.{platform}.Sdk.{(tfm == "net8.0" ? "net8" : tfm)}\": {{");
writer.WriteLine ($" \"kind\": \"sdk\",");
writer.WriteLine ($" \"version\": \"{apiVersion}\",");
if (tfm == "net8.0") {
writer.WriteLine ($" \"alias-to\": {{");
writer.WriteLine ($" \"any\": \"Microsoft.{platform}.Sdk\"");
writer.WriteLine ($" }}");
}
writer.WriteLine ($" }},");
if (hasWindows) {
writer.WriteLine ($" \"Microsoft.{platform}.Windows.Sdk.Aliased.{(tfm == "net8.0" ? "net8" : tfm)}\": {{");
writer.WriteLine ($" \"kind\": \"sdk\",");
writer.WriteLine ($" \"version\": \"{apiVersion}\",");
writer.WriteLine ($" \"alias-to\": {{");
if (tfm == "net8.0") {
writer.WriteLine ($" \"win-x64\": \"Microsoft.{platform}.Windows.Sdk\",");
writer.WriteLine ($" \"win-x86\": \"Microsoft.{platform}.Windows.Sdk\",");
writer.WriteLine ($" \"win-arm64\": \"Microsoft.{platform}.Windows.Sdk\",");
} else {
writer.WriteLine ($" \"win-x64\": \"Microsoft.{platform}.Windows.Sdk.{tfm}\",");
writer.WriteLine ($" \"win-x86\": \"Microsoft.{platform}.Windows.Sdk.{tfm}\",");
writer.WriteLine ($" \"win-arm64\": \"Microsoft.{platform}.Windows.Sdk.{tfm}\",");
}
writer.WriteLine ($" }}");
writer.WriteLine ($" }},");
}
}
writer.WriteLine ($" \"Microsoft.{platform}.Ref.{currentApiVersion}\": {{");
writer.WriteLine ($" \"kind\": \"framework\",");
writer.WriteLine ($" \"version\": \"{version}\"");
writer.WriteLine ($" }},");
foreach (var rid in runtimeIdentifiers) {
writer.WriteLine ($" \"Microsoft.{platform}.Runtime.{rid}.{currentApiVersion}\": {{");
writer.WriteLine ($" \"kind\": \"framework\",");
writer.WriteLine ($" \"version\": \"{version}\"");
writer.WriteLine ($" }},");
}
writer.WriteLine ($" \"Microsoft.{platform}.Templates.net9\": {{");
writer.WriteLine ($" \"kind\": \"template\",");
writer.WriteLine ($" \"version\": \"{version}\",");
writer.WriteLine ($" \"alias-to\": {{");
writer.WriteLine ($" \"any\": \"Microsoft.{platform}.Templates\",");
writer.WriteLine ($" }}");
writer.WriteLine ($" }}");
writer.WriteLine ($" }}");
writer.WriteLine ($"}}");
}
if (failed)
Environment.Exit (1);
Environment.Exit (0);