Skip to content

Commit 99473af

Browse files
authored
[StaticWebAssets] Avoid reading the manifest as part of the Build (#43722)
1 parent 7ee7132 commit 99473af

File tree

5 files changed

+71
-12
lines changed

5 files changed

+71
-12
lines changed

src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.Publish.targets

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,16 @@ Copyright (c) .NET Foundation. All rights reserved.
6161
for example, assets from packages as a result of a publish (no-build) invocation. Those assets were already taken
6262
into account when we built the build manifest that we are about to load for resuming the publish process. -->
6363
<PropertyGroup>
64-
<_ShouldLoadBuildManifestAndUpdateAssets>false</_ShouldLoadBuildManifestAndUpdateAssets>
65-
<_ShouldLoadBuildManifestAndUpdateAssets
66-
Condition="@(_CachedBuildStaticWebAssets) == '' or @(_CachedBuildStaticWebAssetDiscoveryPatterns) == '' or @(_CachedBuildStaticWebAssetReferencedProjectsConfiguration) == ''">true</_ShouldLoadBuildManifestAndUpdateAssets>
64+
<_HasStaticWebAssetsProjectReferences Condition="@(ProjectReference) != ''">true</_HasStaticWebAssetsProjectReferences>
65+
<_HasCachedBuildStaticWebAssets Condition="@(_CachedBuildStaticWebAssets) == ''">false</_HasCachedBuildStaticWebAssets>
66+
<_HasCachedBuildStaticWebAssetEndpoints Condition="@(_CachedBuildStaticWebAssetEndpoints) == ''">false</_HasCachedBuildStaticWebAssetEndpoints>
67+
<_HasCachedBuildStaticWebAssetDiscoveryPatterns Condition="@(_CachedBuildStaticWebAssetDiscoveryPatterns) == ''">false</_HasCachedBuildStaticWebAssetDiscoveryPatterns>
68+
<_HasCachedBuildStaticWebAssetReferencedProjectsConfiguration Condition="@(_CachedBuildStaticWebAssetReferencedProjectsConfiguration) == ''">false</_HasCachedBuildStaticWebAssetReferencedProjectsConfiguration>
69+
<_ShouldLoadBuildManifestAndUpdateAssets>false</_ShouldLoadBuildManifestAndUpdateAssets>
70+
<_ShouldLoadBuildManifestAndUpdateAssets Condition="'$(_HasCachedBuildStaticWebAssets)' == 'false' or
71+
'$(_HasCachedBuildStaticWebAssetEndpoints)' == 'false' or
72+
'$(_HasCachedBuildStaticWebAssetDiscoveryPatterns)' == 'false' or
73+
('$(_HasStaticWebAssetsProjectReferences)' == 'true' and '$(_HasCachedBuildStaticWebAssetReferencedProjectsConfiguration)' == 'false')">true</_ShouldLoadBuildManifestAndUpdateAssets>
6774
</PropertyGroup>
6875

6976
<ItemGroup>
@@ -131,11 +138,11 @@ Copyright (c) .NET Foundation. All rights reserved.
131138
<ItemGroup>
132139
<_ReferencedProjectPublishStaticWebAssetsUpdateCandidates
133140
Include="@(_ReferencedProjectPublishStaticWebAssetsItems)"
134-
Condition="'%(_ReferencedProjectPublishStaticWebAssetsItems.ResultType)' == 'StaticWebAsset'" />
141+
Condition="'%(_ReferencedProjectPublishStaticWebAssetsItems.ResultType)' == 'StaticWebAsset'" />
135142

136143
<_ReferencedProjectPublishStaticWebAssetEndpointsUpdateCandidates
137144
Include="@(_ReferencedProjectPublishStaticWebAssetsItems)"
138-
Condition="'%(_ReferencedProjectPublishStaticWebAssetsItems.ResultType)' == 'StaticWebAssetEndpoint'" />
145+
Condition="'%(_ReferencedProjectPublishStaticWebAssetsItems.ResultType)' == 'StaticWebAssetEndpoint'" />
139146
</ItemGroup>
140147

141148
<UpdateExternallyDefinedStaticWebAssets Condition="$(_HasProjectsWithStaticWebAssetPublishTargets)"

src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.targets

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,13 @@ Copyright (c) .NET Foundation. All rights reserved.
640640
CacheFilePath="$(StaticWebAssetBuildManifestPath)">
641641
</GenerateStaticWebAssetsDevelopmentManifest>
642642

643+
<ItemGroup>
644+
<_CachedBuildStaticWebAssets Condition="'@(_CachedBuildStaticWebAssets)' == ''" Include="@(StaticWebAsset)" />
645+
<_CachedBuildStaticWebAssetEndpoints Condition="'@(_CachedBuildStaticWebAssetEndpoints)' == ''" Include="@(StaticWebAssetEndpoint)" />
646+
<_CachedBuildStaticWebAssetReferencedProjectsConfiguration Condition="'@(_CachedBuildStaticWebAssetReferencedProjectsConfiguration)' == ''" Include="@(StaticWebAssetProjectConfiguration)" />
647+
<_CachedBuildStaticWebAssetDiscoveryPatterns Condition="'@(_CachedBuildStaticWebAssetDiscoveryPatterns)' == ''" Include="@(StaticWebAssetDiscoveryPattern)" />
648+
</ItemGroup>
649+
643650
<ItemGroup>
644651
<FileWrites Include="$(StaticWebAssetBuildManifestPath)" />
645652
<FileWrites Include="$(StaticWebAssetDevelopmentManifestPath)" />

src/StaticWebAssetsSdk/Tasks/GenerateStaticWebAssetsDevelopmentManifest.cs

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ namespace Microsoft.AspNetCore.StaticWebAssets.Tasks
1313
// is case insensitive.
1414
public class GenerateStaticWebAssetsDevelopmentManifest : Task
1515
{
16+
private static readonly char[] _separator = ['/'];
17+
1618
[Required]
1719
public string Source { get; set; }
1820

@@ -62,10 +64,32 @@ public StaticWebAssetsDevelopmentManifest ComputeDevelopmentManifest(
6264
IEnumerable<StaticWebAssetsDiscoveryPattern> discoveryPatterns)
6365
{
6466
var assetsWithPathSegments = ComputeManifestAssets(assets).ToArray();
67+
Array.Sort(assetsWithPathSegments);
6568

6669
var discoveryPatternsByBasePath = discoveryPatterns
6770
.GroupBy(p => p.HasSourceId(Source) ? "" : p.BasePath,
68-
(key, values) => (key.Split(new[] { '/' }, options: StringSplitOptions.RemoveEmptyEntries), values));
71+
(key, values) =>
72+
(key.Split(_separator, options: StringSplitOptions.RemoveEmptyEntries),
73+
values.OrderBy(id => id.ContentRoot).ThenBy(id => id.Pattern).ToArray())).ToArray();
74+
75+
Array.Sort(discoveryPatternsByBasePath, (x, y) =>
76+
{
77+
var lengthResult = x.Item1.Length.CompareTo(y.Item1.Length);
78+
if (lengthResult != 0)
79+
{
80+
return lengthResult;
81+
}
82+
for (var i = 0; i < x.Item1.Length; i++)
83+
{
84+
var comparison = x.Item1[i].CompareTo(y.Item1[i]);
85+
if (comparison != 0)
86+
{
87+
return comparison;
88+
}
89+
}
90+
91+
return 0;
92+
});
6993

7094
var manifest = CreateManifest(assetsWithPathSegments, discoveryPatternsByBasePath);
7195
return manifest;
@@ -133,7 +157,7 @@ private void PersistManifest(StaticWebAssetsDevelopmentManifest manifest)
133157

134158
private StaticWebAssetsDevelopmentManifest CreateManifest(
135159
SegmentsAssetPair[] assetsWithPathSegments,
136-
IEnumerable<(string[], IEnumerable<StaticWebAssetsDiscoveryPattern> values)> discoveryPatternsByBasePath)
160+
(string[], StaticWebAssetsDiscoveryPattern[] values)[] discoveryPatternsByBasePath)
137161
{
138162
var contentRootIndex = new Dictionary<string, int>();
139163
var root = new StaticWebAssetNode() { };
@@ -326,18 +350,39 @@ public class StaticWebAssetNode
326350
public StaticWebAssetPattern[] Patterns { get; set; }
327351
}
328352

329-
private struct SegmentsAssetPair
353+
private struct SegmentsAssetPair : IComparable<SegmentsAssetPair>
330354
{
355+
private static readonly char[] separator = ['/'];
356+
331357
public SegmentsAssetPair(string path, StaticWebAsset asset)
332358
{
333-
PathSegments = path.Split(new[] { '/' }, options: StringSplitOptions.RemoveEmptyEntries);
359+
PathSegments = path.Split(separator, options: StringSplitOptions.RemoveEmptyEntries);
334360
Asset = asset;
335361
}
336362

337363
public string[] PathSegments { get; }
338364

339365
public StaticWebAsset Asset { get; }
340366

367+
public int CompareTo(SegmentsAssetPair other)
368+
{
369+
if (PathSegments.Length != other.PathSegments.Length)
370+
{
371+
return PathSegments.Length.CompareTo(other.PathSegments.Length);
372+
}
373+
374+
for (var i = 0; i < PathSegments.Length; i++)
375+
{
376+
var comparison = PathSegments[i].CompareTo(other.PathSegments[i]);
377+
if (comparison != 0)
378+
{
379+
return comparison;
380+
}
381+
}
382+
383+
return 0;
384+
}
385+
341386
public void Deconstruct(out string[] segments, out StaticWebAsset asset)
342387
{
343388
asset = Asset;

test/Microsoft.NET.Sdk.Razor.Tests/StaticWebAssets/GenerateStaticWebAssetsDevelopmentManifestTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,8 +540,8 @@ public void ComputeDevelopmentManifest_CanMapMultiplePatternsOnSameNodeWithDiffe
540540
CreateIntermediateNode(
541541
("_other", CreateIntermediateNode(
542542
("_project", CreateIntermediateNode().AddPatterns(
543-
(0, "*.js", 2),
544-
(1, "*.css", 2)))))),
543+
(0, "*.css", 2),
544+
(1, "*.js", 2)))))),
545545
Path.GetFullPath("wwwroot"),
546546
Path.GetFullPath("styles"));
547547

test/Microsoft.NET.Sdk.Razor.Tests/StaticWebAssetsIntegrationTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ public void BuildProjectWithReferences_NoDependencies_GeneratesJsonManifestAndCo
692692

693693
// Second build
694694
var secondBuild = CreateBuildCommand(ProjectDirectory, "AppWithPackageAndP2PReference");
695-
secondBuild.Execute("/p:BuildProjectReferences=false").Should().Pass();
695+
ExecuteCommand(secondBuild,"/p:BuildProjectReferences=false").Should().Pass();
696696

697697
// GenerateStaticWebAssetsManifest should generate the manifest file.
698698
new FileInfo(path).Should().Exist();

0 commit comments

Comments
 (0)