Răsfoiți Sursa

Produce a manifest for Blazor SDK

Pranav K 5 ani în urmă
părinte
comite
bcc064455d

+ 13 - 0
eng/Version.Details.xml

@@ -286,6 +286,15 @@
       <Uri>https://github.com/dotnet/runtime</Uri>
       <Sha>1df2bc9018846da1b1ba4ba38cf04273388c7c27</Sha>
     </Dependency>
+    <Dependency Name="Microsoft.NET.Runtime.MonoAOTCompiler.Task" Version="6.0.0-preview.2.21116.2">
+      <Uri>https://github.com/dotnet/runtime</Uri>
+      <Sha>c07d59af4edfb22ebef9a8922cca990f6242b53b</Sha>
+    </Dependency>
+    <Dependency Name="Microsoft.NET.Runtime.WebAssembly.Sdk" Version="6.0.0-preview.2.21116.2">
+      <Uri>https://github.com/dotnet/runtime</Uri>
+      <Sha>c07d59af4edfb22ebef9a8922cca990f6242b53b</Sha>
+    </Dependency>
+
     <!--
          Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
          All Runtime.$rid packages should have the same version.
@@ -294,6 +303,10 @@
       <Uri>https://github.com/dotnet/runtime</Uri>
       <Sha>1df2bc9018846da1b1ba4ba38cf04273388c7c27</Sha>
     </Dependency>
+    <Dependency Name="Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm" Version="6.0.0-preview.2.21117.2">
+      <Uri>https://github.com/dotnet/runtime</Uri>
+      <Sha>c07d59af4edfb22ebef9a8922cca990f6242b53b</Sha>
+    </Dependency>
     <Dependency Name="Microsoft.NETCore.BrowserDebugHost.Transport" Version="6.0.0-preview.2.21117.2">
       <Uri>https://github.com/dotnet/runtime</Uri>
       <Sha>1df2bc9018846da1b1ba4ba38cf04273388c7c27</Sha>

+ 3 - 0
eng/Versions.props

@@ -67,6 +67,9 @@
     <MicrosoftExtensionsDependencyModelVersion>6.0.0-preview.2.21117.2</MicrosoftExtensionsDependencyModelVersion>
     <MicrosoftNETCoreAppRefVersion>6.0.0-preview.2.21117.2</MicrosoftNETCoreAppRefVersion>
     <MicrosoftNETCoreAppRuntimewinx64Version>6.0.0-preview.2.21117.2</MicrosoftNETCoreAppRuntimewinx64Version>
+    <MicrosoftNETRuntimeMonoAOTCompilerTaskVersion>6.0.0-preview.2.21116.2</MicrosoftNETRuntimeMonoAOTCompilerTaskVersion>
+    <MicrosoftNETRuntimeWebAssemblySdkVersion>6.0.0-preview.2.21116.2</MicrosoftNETRuntimeWebAssemblySdkVersion>
+    <MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion>6.0.0-preview.2.21116.2</MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion>
     <MicrosoftNETCoreBrowserDebugHostTransportVersion>6.0.0-preview.2.21117.2</MicrosoftNETCoreBrowserDebugHostTransportVersion>
     <MicrosoftWin32RegistryVersion>6.0.0-preview.2.21117.2</MicrosoftWin32RegistryVersion>
     <MicrosoftWin32SystemEventsVersion>6.0.0-preview.2.21117.2</MicrosoftWin32SystemEventsVersion>

+ 199 - 0
src/Components/WebAssembly/BlazorManifest/acquire/Program.cs

@@ -0,0 +1,199 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace acquire
+{
+    class Program
+    {
+        const string ManifestVersion = "6.0.100";
+
+        static string MuxerPath { get; } = GetDotnetPath();
+
+        static string GetDotnetPath()
+        {
+            // Process.MainModule is app[.exe] and not `dotnet`. We can instead calculate the dotnet SDK path
+            // by looking at the shared fx directory instead.
+            // depsFile = /dotnet/shared/Microsoft.NETCore.App/6.0-preview2/Microsoft.NETCore.App.deps.json
+            var depsFile = (string)AppContext.GetData("FX_DEPS_FILE");
+            return Path.GetFullPath(Path.Combine(Path.GetDirectoryName(depsFile), "..", "..", "..", "dotnet" + (OperatingSystem.IsWindows() ? ".exe" : "")));
+        }
+
+        static int Main(string[] args)
+        {
+            System.Console.WriteLine(MuxerPath);
+            var sdkDirectory = args.Length > 0 ? args[0] : Path.GetDirectoryName(MuxerPath);
+            var tempDirectory = Path.Combine(Directory.GetCurrentDirectory(), "tmp", Path.GetRandomFileName());
+            var restoreDirectory = Path.Combine(tempDirectory, ".nuget");
+
+            try
+            {
+                var restore = Restore(tempDirectory, restoreDirectory, out var packs);
+                if (restore != 0)
+                {
+                    return restore;
+                }
+
+                var sourceManifestDirectory = Path.Combine(restoreDirectory, "microsoft.net.sdk.blazorwebassembly.aot", ManifestVersion);
+                var targetManifestDirectory = Path.Combine(sdkDirectory, "sdk-manifests", ManifestVersion, "Microsoft.NET.Sdk.BlazorWebAssembly.AOT");
+                Move(sourceManifestDirectory, targetManifestDirectory);
+
+                foreach (var (id, version) in packs)
+                {
+                    var source = Path.Combine(restoreDirectory, id.ToLowerInvariant(), version);
+                    var destination = Path.Combine(sdkDirectory, "packs", id, version);
+
+                    Move(source, destination);
+                }
+
+                var sdkVersionProc = Process.Start(new ProcessStartInfo
+                {
+                    FileName = MuxerPath,
+                    Arguments = "--version",
+                    RedirectStandardOutput = true,
+                });
+                sdkVersionProc.WaitForExit();
+                var sdkVersion = sdkVersionProc.StandardOutput.ReadToEnd().Trim();
+                var sentinelPath = Path.Combine(sdkDirectory, "sdk", sdkVersion, "EnableWorkloadResolver.sentinel");
+                Console.WriteLine($"Writing sentinel to {sentinelPath}.");
+
+                File.WriteAllBytes(sentinelPath, Array.Empty<byte>());
+            }
+            finally
+            {
+                Directory.Delete(tempDirectory, recursive: true);
+            }
+
+            return 0;
+        }
+
+        static void Move(string source, string destination)
+        {
+            Console.WriteLine($"Moving {source} to {destination}...");
+            if (Directory.Exists(destination))
+            {
+                Directory.Delete(destination, recursive: true);
+            }
+
+            Directory.CreateDirectory(Path.GetDirectoryName(destination));
+
+            Directory.Move(source, destination);
+        }
+
+        static int Restore(string tempDirectory, string restoreDirectory, out List<(string, string)> packs)
+        {
+            packs = null;
+
+            var restoreProject = Path.Combine(tempDirectory, "restore", "Restore.csproj");
+            var restoreProjectDirectory = Directory.CreateDirectory(Path.GetDirectoryName(restoreProject));
+
+            File.WriteAllText(Path.Combine(restoreProjectDirectory.FullName, "Directory.Build.props"), "<Project />");
+            File.WriteAllText(Path.Combine(restoreProjectDirectory.FullName, "Directory.Build.targets"), "<Project />");
+
+            var projectFile = @"
+<Project Sdk=""Microsoft.NET.Sdk"">
+    <PropertyGroup>
+        <TargetFramework>net6.0</TargetFramework>
+    </PropertyGroup>
+    <ItemGroup>
+        <PackageReference Include=""Microsoft.NET.Sdk.BlazorWebAssembly.AOT"" Version=""6.0.0-*"" />
+    </ItemGroup>
+</Project>
+";
+            File.WriteAllText(restoreProject, projectFile);
+
+            Console.WriteLine("Restoring...");
+
+            var process = Process.Start(new ProcessStartInfo
+            {
+                FileName = MuxerPath,
+                ArgumentList = { "restore", restoreProject },
+                Environment =
+                {
+                    ["NUGET_PACKAGES"] = restoreDirectory,
+                },
+            });
+            process.WaitForExit();
+            if (process.ExitCode != 0)
+            {
+                Console.Error.WriteLine("Unable to restore Microsoft.NET.Sdk.BlazorWebAssembly.AOT workload.");
+                return 1;
+            }
+
+            var manifestDirectory = Path.Combine(restoreDirectory, "microsoft.net.sdk.blazorwebassembly.aot");
+            var version = Directory.EnumerateDirectories(manifestDirectory).First();
+
+            manifestDirectory = Path.Combine(manifestDirectory, ManifestVersion);
+            Directory.Move(version, manifestDirectory);
+
+            var manifestPath = Path.Combine(manifestDirectory, "WorkloadManifest.json");
+            var manifest = JsonSerializer.Deserialize<PackInformation>(File.ReadAllBytes(manifestPath), new JsonSerializerOptions(JsonSerializerDefaults.Web));
+
+            projectFile = @"
+<Project Sdk=""Microsoft.NET.Sdk"">
+    <PropertyGroup>
+        <TargetFramework>net6.0</TargetFramework>
+        <NoWarn>$(NoWarn);NU1213</NoWarn>
+    </PropertyGroup>
+    <ItemGroup>
+";
+            packs = new List<(string id, string version)>();
+            foreach (var item in manifest.Packs)
+            {
+                var packageName = item.Key;
+                if (item.Value.AliasTo is Dictionary<string, string> alias)
+                {
+                    if (OperatingSystem.IsWindows())
+                    {
+                        packageName = Environment.Is64BitProcess ? alias["win-x64"] : alias["win-x86"];
+                    }
+                    else if (OperatingSystem.IsMacOS())
+                    {
+                        packageName = alias["osx-x64"];
+                    }
+                    else if (OperatingSystem.IsLinux())
+                    {
+                        packageName = alias["linux-x64"];
+                    }
+                    else
+                    {
+                        Console.Error.WriteLine("Unsupported platform.");
+                        return 1;
+                    }
+                }
+                projectFile += @$"<PackageReference Include=""{packageName}"" Version=""{item.Value.Version}"" />";
+                packs.Add((packageName, item.Value.Version));
+            }
+
+            projectFile += @"
+    </ItemGroup>
+</Project>
+";
+            File.WriteAllText(restoreProject, projectFile);
+
+            process = Process.Start(new ProcessStartInfo
+            {
+                FileName = MuxerPath,
+                ArgumentList = { "restore", restoreProject },
+                RedirectStandardError = true,
+                RedirectStandardOutput = true,
+                Environment =
+                {
+                    ["NUGET_PACKAGES"] = restoreDirectory,
+                },
+            });
+            process.WaitForExit();
+
+
+            return 0;
+        }
+
+        private record PackInformation(IDictionary<string, PackVersionInformation> Packs);
+
+        private record PackVersionInformation(string Version, [property: JsonPropertyName("alias-to")] Dictionary<string, string> AliasTo);
+    }
+}

+ 16 - 0
src/Components/WebAssembly/BlazorManifest/acquire/dotnet-install-blazoraot.csproj

@@ -0,0 +1,16 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net6.0</TargetFramework>
+    <PackAsTool>true</PackAsTool>
+    <IsShippingPackage>true</IsShippingPackage>
+    <Description>dotnet tool for acquiring Blazor AOT SDK.</Description>
+    <AssemblyName>dotnet-install-blazoraot</AssemblyName>
+    <PackageId>dotnet-install-blazoraot</PackageId>
+    <GenerateDocumentationFile>false</GenerateDocumentationFile>
+    <!-- Set this to false because there's nothing to reference here. -->
+    <IsProjectReferenceProvider>false</IsProjectReferenceProvider>
+  </PropertyGroup>
+
+</Project>

+ 37 - 0
src/Components/WebAssembly/BlazorManifest/src/BlazorManifest.csproj

@@ -0,0 +1,37 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+    <PackageId>Microsoft.NET.Sdk.BlazorWebAssembly.AOT</PackageId>
+    <IsShippingPackage>true</IsShippingPackage>
+    <Description>SDK manifest for Blazor WebAssembly AOT.</Description>
+    <GenerateDocumentationFile>false</GenerateDocumentationFile>
+    <IncludeBuildOutput>false</IncludeBuildOutput>
+    <!-- Set this to false because there's nothing to reference here. -->
+    <IsProjectReferenceProvider>false</IsProjectReferenceProvider>
+  </PropertyGroup>
+
+  <Target Name="_PrepareForPack" BeforeTargets="CoreBuild">
+    <PropertyGroup>
+      <_WorkloadManifestProperties>
+        MicrosoftNETRuntimeMonoAOTCompilerTaskVersion=$(MicrosoftNETRuntimeMonoAOTCompilerTaskVersion);
+        MicrosoftNETRuntimeWebAssemblySdkVersion=$(MicrosoftNETRuntimeWebAssemblySdkVersion);
+        MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion=$(MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion);
+      </_WorkloadManifestProperties>
+
+      <WorkloadManifestPath>$(IntermediateOutputPath)WorkloadManifest.json</WorkloadManifestPath>
+    </PropertyGroup>
+
+    <GenerateFileFromTemplate
+      TemplateFile="WorkloadManifest.json.in"
+      Properties="$(_WorkloadManifestProperties)"
+      OutputPath="$(WorkloadManifestPath)" />
+
+    <ItemGroup>
+      <None Include="$(WorkloadManifestPath)" Pack="true" PackagePath="\" />
+      <None Include="WorkloadManifest.targets" Pack="true" PackagePath="\" />
+      <None Include="_._" Pack="true" PackagePath="lib\$(DefaultNetCoreTargetFramework)\_._" />
+    </ItemGroup>
+  </Target>
+
+</Project>

+ 33 - 0
src/Components/WebAssembly/BlazorManifest/src/WorkloadManifest.json.in

@@ -0,0 +1,33 @@
+{
+  "version": 1,
+  "workloads": {
+    "microsoft-net-sdk-blazorwebassembly-aot": {
+      "description": "Blazor WebAssembly AOT workload",
+      "packs": [
+        "Microsoft.NET.Runtime.MonoAOTCompiler.Task",
+        "Microsoft.NET.Runtime.WebAssembly.Sdk",
+        "Microsoft.Netcore.App.Runtime.Aot.Cross.browser-wasm"
+      ]
+    }
+  },
+  "packs": {
+    "Microsoft.NET.Runtime.MonoAOTCompiler.Task": {
+      "kind": "Sdk",
+      "version": "${MicrosoftNETRuntimeMonoAOTCompilerTaskVersion}"
+    },
+    "Microsoft.NET.Runtime.WebAssembly.Sdk": {
+      "kind": "Sdk",
+      "version": "${MicrosoftNETRuntimeWebAssemblySdkVersion}"
+    },
+    "Microsoft.NETCore.App.Runtime.AOT.Cross.browser-wasm": {
+      "kind": "Sdk",
+      "version": "${MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion}",
+      "alias-to": {
+        "win-x86": "microsoft.netcore.app.runtime.aot.win-x86.cross.browser-wasm",
+        "win-x64": "microsoft.netcore.app.runtime.aot.win-x64.cross.browser-wasm",
+        "linux-x64": "microsoft.netcore.app.runtime.aot.linux-x64.cross.browser-wasm",
+        "osx-x64": "microsoft.netcore.app.runtime.aot.osx-x64.cross.browser-wasm"
+      }
+    }
+  }
+}

+ 11 - 0
src/Components/WebAssembly/BlazorManifest/src/WorkloadManifest.targets

@@ -0,0 +1,11 @@
+<Project>
+    <PropertyGroup Condition="'$(UsingMicrosoftNETSdkBlazorWebAssembly)'=='true' AND '$(RunAOTCompilation)' == 'true'">
+      <UsingBlazorAOTWorkloadManifest>true</UsingBlazorAOTWorkloadManifest>
+    </PropertyGroup>
+
+    <ImportGroup Condition="'$(UsingMicrosoftNETSdkBlazorWebAssembly)'=='true' AND '$(RunAOTCompilation)' == 'true'">
+      <Import Project="Sdk.props" Sdk="Microsoft.NET.Runtime.MonoAOTCompiler.Task" />
+      <Import Project="Sdk.targets" Sdk="Microsoft.NET.Runtime.WebAssembly.Sdk" />
+      <Import Project="Sdk.props" Sdk="Microsoft.Netcore.App.Runtime.Aot.Cross.browser-wasm" />
+    </ImportGroup>
+</Project>

+ 0 - 0
src/Components/WebAssembly/BlazorManifest/src/_._