From efbf2c5678966b852c98224bfe02f01693fc0ef2 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Tue, 16 Oct 2018 22:34:31 +0100 Subject: [PATCH] When tracing dependencies *without* linking, don't fail the build if there are unresolved dependencies There are legitimate use cases for referencing BCL assemblies that *aren't* in the Mono WebAssembly BCL, particularly for Blazor-on-the-server which runs on CoreCLR (and hence supports a broader BCL) anyway. --- .../Core/RuntimeDependenciesResolver.cs | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNetCore.Blazor.Build/Core/RuntimeDependenciesResolver.cs b/src/Microsoft.AspNetCore.Blazor.Build/Core/RuntimeDependenciesResolver.cs index b981424aa8..18637753cc 100644 --- a/src/Microsoft.AspNetCore.Blazor.Build/Core/RuntimeDependenciesResolver.cs +++ b/src/Microsoft.AspNetCore.Blazor.Build/Core/RuntimeDependenciesResolver.cs @@ -76,7 +76,7 @@ namespace Microsoft.AspNetCore.Blazor.Build internal void ResolveAssemblies() { - var visitedAssemblies = new Dictionary(); + var visitedAssemblies = new HashSet(); var pendingAssemblies = new Stack(); pendingAssemblies.Push(Assembly.Definition.Name); ResolveAssembliesCore(); @@ -85,15 +85,24 @@ namespace Microsoft.AspNetCore.Blazor.Build { while (pendingAssemblies.TryPop(out var current)) { - if (!visitedAssemblies.ContainsKey(current.Name)) + if (!visitedAssemblies.Contains(current.Name)) { + visitedAssemblies.Add(current.Name); + + // Not all references will be resolvable within the Mono BCL, particularly + // when building for server-side Blazor as you will be running on CoreCLR + // and therefore may depend on System.* BCL assemblies that aren't present + // in Mono WebAssembly. Skipping unresolved assemblies here is equivalent + // to passing "--skip-unresolved true" to the Mono linker. var resolved = Resolve(current); - visitedAssemblies[current.Name] = resolved; - Results.Add(resolved); - var references = GetAssemblyReferences(resolved); - foreach (var reference in references) + if (resolved != null) { - pendingAssemblies.Push(reference); + Results.Add(resolved); + var references = GetAssemblyReferences(resolved); + foreach (var reference in references) + { + pendingAssemblies.Push(reference); + } } } }