[wasm] Add new `wasm-experimental` workload (#71974)
authorAnkit Jain <radical@gmail.com>
Tue, 12 Jul 2022 19:22:49 +0000 (15:22 -0400)
committerGitHub <noreply@github.com>
Tue, 12 Jul 2022 19:22:49 +0000 (15:22 -0400)
* InstallWorkloadFromArtifact: Support multiple workloads

* [wasm] Move the templates pack to a new workload - wasm-experimental

eng/testing/tests.wasm.targets
eng/testing/workloads-testing.targets
src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Manifest/WorkloadManifest.json.in
src/tasks/WorkloadBuildTasks/InstallWorkloadFromArtifacts.cs

index 4c5310c..689378e 100644 (file)
                           ManifestName="Microsoft.NET.Workload.Mono.ToolChain"
                           Version="$(PackageVersion)"
                           VersionBand="$(SdkBandVersion)" />
+    <WorkloadIdForTesting Include="wasm-experimental"
+                          ManifestName="Microsoft.NET.Workload.Mono.ToolChain"
+                          Version="$(PackageVersion)"
+                          VersionBand="$(SdkBandVersion)" />
 
     <WasmExtraFilesToDeploy Condition="'$(_UseWasmSymbolicator)' == 'true'" Include="$(MonoProjectRoot)wasm\data\wasm-symbol-patterns.txt" />
     <WasmExtraFilesToDeploy Condition="'$(_UseWasmSymbolicator)' == 'true'" Include="$(ArtifactsBinDir)WasmSymbolicator\$(Configuration)\$(NetCoreAppToolCurrent)\WasmSymbolicator.dll" />
index c0b07b9..c4e9e5e 100644 (file)
     <Message Text="Packages found in $(LibrariesShippingPackagesDir): @(_BuiltNuGets)" Importance="Low" />
 
     <InstallWorkloadFromArtifacts
-                     WorkloadId="@(WorkloadIdForTesting)"
+                     WorkloadIds="@(WorkloadIdForTesting)"
                      VersionBand="$(SdkBandVersion)"
                      LocalNuGetsPath="$(LibrariesShippingPackagesDir)"
                      TemplateNuGetConfigPath="$(RepoRoot)NuGet.config"
           Outputs="$(SdkWithNoWorkload_WorkloadStampPath)">
 
     <InstallWorkloadFromArtifacts
-                     WorkloadId="@(WorkloadIdForTesting)"
+                     WorkloadIds="@(WorkloadIdForTesting)"
                      VersionBand="$(SdkBandVersion)"
                      LocalNuGetsPath="$(LibrariesShippingPackagesDir)"
                      TemplateNuGetConfigPath="$(RepoRoot)NuGet.config"
index 17a2c97..e0b21a8 100644 (file)
@@ -8,13 +8,20 @@
       "description": ".NET WebAssembly build tools",
       "packs": [
         "Microsoft.NET.Runtime.WebAssembly.Sdk",
-        "Microsoft.NET.Runtime.WebAssembly.Templates",
         "Microsoft.NETCore.App.Runtime.Mono.browser-wasm",
         "Microsoft.NETCore.App.Runtime.AOT.Cross.browser-wasm"
       ],
       "extends": [ "microsoft-net-runtime-mono-tooling", "microsoft-net-sdk-emscripten" ],
       "platforms": [ "win-x64", "linux-x64", "osx-x64", "osx-arm64" ]
     },
+    "wasm-experimental": {
+      "description": ".NET WebAssembly experimental",
+      "packs": [
+        "Microsoft.NET.Runtime.WebAssembly.Templates"
+      ],
+      "extends": [ "wasm-tools" ],
+      "platforms": [ "win-x64", "linux-x64", "osx-x64", "osx-arm64" ]
+    },
     "microsoft-net-runtime-android": {
       "abstract": true,
       "description": "Android Mono Runtime",
index 08f933b..6fa8be1 100644 (file)
@@ -4,9 +4,9 @@
 using System;
 using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
+using System.Globalization;
 using System.IO;
 using System.Linq;
-using System.Text;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 using Microsoft.Build.Framework;
@@ -19,7 +19,7 @@ namespace Microsoft.Workload.Build.Tasks
     public class InstallWorkloadFromArtifacts : Task
     {
         [Required, NotNull]
-        public ITaskItem?     WorkloadId         { get; set; }
+        public ITaskItem[]    WorkloadIds         { get; set; } = Array.Empty<ITaskItem>();
 
         [Required, NotNull]
         public string?        VersionBand        { get; set; }
@@ -41,7 +41,12 @@ namespace Microsoft.Workload.Build.Tasks
         {
             try
             {
-                return ExecuteInternal();
+                foreach (var workloadIdItem in WorkloadIds)
+                {
+                    if (!ExecuteInternal(workloadIdItem))
+                        return false;
+                }
+                return true;
             }
             catch (LogAsErrorException laee)
             {
@@ -50,10 +55,10 @@ namespace Microsoft.Workload.Build.Tasks
             }
         }
 
-        private bool ExecuteInternal()
+        private bool ExecuteInternal(ITaskItem workloadId)
         {
-            if (!HasMetadata(WorkloadId, nameof(WorkloadId), "Version") ||
-                !HasMetadata(WorkloadId, nameof(WorkloadId), "ManifestName"))
+            if (!HasMetadata(workloadId, nameof(workloadId), "Version") ||
+                !HasMetadata(workloadId, nameof(workloadId), "ManifestName"))
             {
                 return false;
             }
@@ -70,10 +75,10 @@ namespace Microsoft.Workload.Build.Tasks
                 return false;
             }
 
-            Log.LogMessage(MessageImportance.High, $"{Environment.NewLine}** Installing workload manifest {WorkloadId.ItemSpec} **{Environment.NewLine}");
+            Log.LogMessage(MessageImportance.High, $"{Environment.NewLine}** Installing workload manifest {workloadId.ItemSpec} **{Environment.NewLine}");
 
             string nugetConfigContents = GetNuGetConfig();
-            if (!InstallWorkloadManifest(WorkloadId.GetMetadata("ManifestName"), WorkloadId.GetMetadata("Version"), nugetConfigContents, stopOnMissing: true))
+            if (!InstallWorkloadManifest(workloadId, workloadId.GetMetadata("ManifestName"), workloadId.GetMetadata("Version"), nugetConfigContents, stopOnMissing: true))
                 return false;
 
             if (OnlyUpdateManifests)
@@ -86,7 +91,7 @@ namespace Microsoft.Workload.Build.Tasks
             (int exitCode, string output) = Utils.TryRunProcess(
                                                     Log,
                                                     Path.Combine(SdkDir, "dotnet"),
-                                                    $"workload install --skip-manifest-update --no-cache --configfile \"{nugetConfigPath}\" {WorkloadId.ItemSpec}",
+                                                    $"workload install --skip-manifest-update --no-cache --configfile \"{nugetConfigPath}\" {workloadId.ItemSpec}",
                                                     workingDir: Path.GetTempPath(),
                                                     silent: false,
                                                     debugMessageImportance: MessageImportance.High);
@@ -115,7 +120,7 @@ namespace Microsoft.Workload.Build.Tasks
             return contents.Replace(s_nugetInsertionTag, $@"<add key=""nuget-local"" value=""{LocalNuGetsPath}"" />");
         }
 
-        private bool InstallWorkloadManifest(string name, string version, string nugetConfigContents, bool stopOnMissing)
+        private bool InstallWorkloadManifest(ITaskItem workloadId, string name, string version, string nugetConfigContents, bool stopOnMissing)
         {
             Log.LogMessage(MessageImportance.High, $"Installing workload manifest for {name}/{version}");
 
@@ -168,9 +173,9 @@ namespace Microsoft.Workload.Build.Tasks
             {
                 foreach ((string depName, string depVersion) in manifest.DependsOn)
                 {
-                    if (!InstallWorkloadManifest(depName, depVersion, nugetConfigContents, stopOnMissing: false))
+                    if (!InstallWorkloadManifest(workloadId, depName, depVersion, nugetConfigContents, stopOnMissing: false))
                     {
-                        Log.LogWarning($"Could not install manifest {depName}/{depVersion}. This can be ignored if the workload {WorkloadId.ItemSpec} doesn't depend on it.");
+                        Log.LogWarning($"Could not install manifest {depName}/{depVersion}. This can be ignored if the workload {workloadId.ItemSpec} doesn't depend on it.");
                         continue;
                     }
                 }
@@ -201,7 +206,7 @@ namespace Microsoft.Workload.Build.Tasks
                                 + $"{Environment.NewLine}Using the first one: {first}");
             }
 
-            return first ?? Path.Combine(parentDir, dirName);
+            return first ?? Path.Combine(parentDir, dirName.ToLower(CultureInfo.InvariantCulture));
         }
 
         private sealed record ManifestInformation(