Skip to content

Commit 11fe204

Browse files
authored
[build] Fix local workload template creation (#9250)
The targets that set up the local workload have been moved into a separate ConfigureLocalWorkload.targets, as the Directory.Build.targets file was getting crowded. The template pack is no longer deleted by DeleteExtractedWorkloadPacks, allowing dotnet-local scripts to create new templates again. The workload files and metadata created when installing the temporary `android-deps` workload are now cleaned up, which should fix issues where `bin/Debug/dotnet/dotnet` invocations could fail with: System.Collections.Generic.KeyNotFoundException: The given key 'android-deps' was not present in the dictionary. at System.Collections.Generic.Dictionary`2.get_Item(TKey key) at Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadResolver.GetManifestFromWorkload(WorkloadId workloadId) at Microsoft.DotNet.Cli.WorkloadCommandParser.ShowWorkloadsInfo(ParseResult parseResult, WorkloadInfoHelper workloadInfoHelper, IReporter reporter, String dotnetDir, Boolean showVersion) at Microsoft.DotNet.Cli.CommandLineInfo.PrintInfo() at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, TimeSpan startupTime, ITelemetry telemetryClient) at Microsoft.DotNet.Cli.Program.Main(String[] args) The temporary `android-deps` workload will now install all of the runtime workloads that our workload extends, rather than a hard-coded subset. This should allow the local workload setup to build projects targeting both net9.0-android and net8.0-android. The Windows build stage has been updated to use the local workload configuration for all tests, including creating and building a template.
1 parent 47a3b33 commit 11fe204

File tree

3 files changed

+157
-89
lines changed

3 files changed

+157
-89
lines changed

build-tools/automation/yaml-templates/build-windows.yaml

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,25 @@ stages:
5353
projects: Xamarin.Android.sln
5454
arguments: '-c $(XA.Build.Configuration) -t:Prepare --no-restore -p:AutoProvision=true -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build-prepare.binlog'
5555

56-
# Build, pack .nupkgs, and extract workload packs to dotnet preview test directory
56+
# Build Xamarin.Android and configure local workloads to test improved local build loop
5757
- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml
5858
parameters:
5959
project: Xamarin.Android.sln
6060
arguments: >-
61-
-t:BuildDotNet,PackDotNet -c $(XA.Build.Configuration) -v:n
61+
-t:BuildDotNet -c $(XA.Build.Configuration) -v:n
6262
-bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build.binlog
6363
displayName: Build Solution
6464
continueOnError: false
6565

66+
- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml
67+
parameters:
68+
project: build-tools/create-packs/Microsoft.Android.Sdk.proj
69+
arguments: >-
70+
-t:ConfigureLocalWorkload -c $(XA.Build.Configuration) -v:n -p:RunningOnCI=false
71+
-bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\local-workload.binlog
72+
displayName: Run ConfigureLocalWorkload target
73+
continueOnError: false
74+
6675
- template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml
6776
parameters:
6877
toolName: apkdiff
@@ -75,10 +84,25 @@ stages:
7584
dotNetTestExtraArgs: --filter "TestCategory = SmokeTests"
7685

7786
- task: BatchScript@1
78-
displayName: Test dotnet-local.cmd
87+
displayName: Test dotnet-local.cmd - create template
88+
inputs:
89+
filename: dotnet-local.cmd
90+
arguments: new android -o $(Build.StagingDirectory)/LocalWorkloadTest
91+
92+
- task: BatchScript@1
93+
displayName: Test dotnet-local.cmd - build template
7994
inputs:
8095
filename: dotnet-local.cmd
81-
arguments: build samples\HelloWorld\HelloWorld\HelloWorld.DotNet.csproj
96+
arguments: build -v:n $(Build.StagingDirectory)/LocalWorkloadTest
97+
98+
# Pack .nupkgs and extract workload packs to dotnet preview test directory
99+
- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml
100+
parameters:
101+
project: Xamarin.Android.sln
102+
arguments: >-
103+
-t:PackDotNet -c $(XA.Build.Configuration) -v:n
104+
-bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-pack.binlog
105+
displayName: Test PackDotNet
82106

83107
- template: /build-tools/automation/yaml-templates/upload-results.yaml
84108
parameters:
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<Project>
2+
3+
<ItemGroup>
4+
<_FrameworkListInputs Include="$(MicrosoftAndroidRefPackDir)**" />
5+
<_FrameworkListOutputs Include="$(BuildOutputDirectory)lib\packs\Microsoft.Android.Ref.$(AndroidDefaultTargetDotnetApiLevel)\$(AndroidPackVersion)\data\FrameworkList.xml" />
6+
<_FrameworkListOutputs Include="$(BuildOutputDirectory)lib\packs\Microsoft.Android.Ref.$(AndroidLatestStableApiLevel)\$(AndroidPackVersion)\data\FrameworkList.xml" />
7+
<_FrameworkListOutputs Include="$(BuildOutputDirectory)lib\packs\Microsoft.Android.Ref.$(AndroidLatestUnstableApiLevel)\$(AndroidPackVersion)\data\FrameworkList.xml" />
8+
<_RuntimeListInputs Include="$(MicrosoftAndroidArmPackDir)**" />
9+
<_RuntimeListInputs Include="$(MicrosoftAndroidArm64PackDir)**" />
10+
<_RuntimeListInputs Include="$(MicrosoftAndroidx86PackDir)**" />
11+
<_RuntimeListInputs Include="$(MicrosoftAndroidx64PackDir)**" />
12+
<_RuntimeListOutputs Include="@(AndroidSupportedTargetJitAbi->'$(BuildOutputDirectory)lib\packs\Microsoft.Android.Runtime.$(AndroidDefaultTargetDotnetApiLevel).%(AndroidRID)\$(AndroidPackVersion)\data\RuntimeList.xml')" AndroidRID="%(AndroidRID)" />
13+
<_RuntimeListOutputs Include="@(AndroidSupportedTargetJitAbi->'$(BuildOutputDirectory)lib\packs\Microsoft.Android.Runtime.$(AndroidLatestStableApiLevel).%(AndroidRID)\$(AndroidPackVersion)\data\RuntimeList.xml')" AndroidRID="%(AndroidRID)" />
14+
<_RuntimeListOutputs Include="@(AndroidSupportedTargetJitAbi->'$(BuildOutputDirectory)lib\packs\Microsoft.Android.Runtime.$(AndroidLatestUnstableApiLevel).%(AndroidRID)\$(AndroidPackVersion)\data\RuntimeList.xml')" AndroidRID="%(AndroidRID)" />
15+
<_TemplatesInputs Include="$(XamarinAndroidSourcePath)src\Microsoft.Android.Templates\**" />
16+
<_TemplatesOutputs Include="$(BuildOutputDirectory)lib\template-packs\microsoft.android.templates.$(AndroidPackVersion).nupkg" />
17+
</ItemGroup>
18+
19+
<Target Name="CreateLocalRuntimeLists"
20+
Inputs="$(MSBuildThisFile);@(_RuntimeListInputs)"
21+
Outputs="@(_RuntimeListOutputs)">
22+
<MSBuild
23+
Projects="$(MSBuildThisFileDirectory)Microsoft.Android.Runtime.proj"
24+
Properties="FrameworkListFile=%(_RuntimeListOutputs.Identity);AndroidRID=%(_RuntimeListOutputs.AndroidRID)"
25+
Targets="_GetRuntimePackItems;_GenerateFrameworkListFile"
26+
/>
27+
</Target>
28+
29+
<Target Name="CreateLocalFrameworkLists"
30+
Inputs="$(MSBuildThisFile);@(_FrameworkListInputs)"
31+
Outputs="@(_FrameworkListOutputs)">
32+
<MSBuild
33+
Projects="$(MSBuildThisFileDirectory)Microsoft.Android.Ref.proj"
34+
Properties="FrameworkListFile=%(_FrameworkListOutputs.Identity)"
35+
Targets="_GetTargetingPackItems;_GenerateFrameworkListFile"
36+
/>
37+
</Target>
38+
39+
<Target Name="PackLocalTemplates"
40+
Inputs="@(_TemplatesInputs)"
41+
Outputs="@(_TemplatesOutputs)">
42+
<ItemGroup>
43+
<_PackProps Include="-v:n -c $(Configuration)" />
44+
<_PackProps Include="-p:IncludeSymbols=False" />
45+
<_PackProps Include="-p:OutputPath=$(BuildOutputDirectory)lib\template-packs" />
46+
<_PackProps Include="-p:TemplatePackVersion=$(AndroidPackVersion)" />
47+
<_PackProps Include="-p:PackageId=microsoft.android.templates" />
48+
</ItemGroup>
49+
<Exec Command="&quot;$(DotNetPreviewTool)&quot; pack @(_PackProps, ' ') &quot;$(XamarinAndroidSourcePath)src\Microsoft.Android.Templates\Microsoft.Android.Templates.csproj&quot;" />
50+
</Target>
51+
52+
<UsingTask TaskName="GetAndroidWorkloadExtends" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
53+
<ParameterGroup>
54+
<JsonFilePath ParameterType="System.String" Required="true" />
55+
<ExtendsElement Output="true" ParameterType="System.String" />
56+
</ParameterGroup>
57+
<Task>
58+
<Using Namespace="System" />
59+
<Using Namespace="System.IO" />
60+
<Code Type="Fragment" Language="cs">
61+
<![CDATA[
62+
var jsonContent = File.ReadAllText(JsonFilePath);
63+
var startElement = "\"extends\" : [";
64+
var startIndex = jsonContent.IndexOf(startElement);
65+
var endIndex = jsonContent.IndexOf("]");
66+
if (startIndex != -1) {
67+
startIndex += startElement.Length;
68+
endIndex = jsonContent.IndexOf("]", startIndex);
69+
if (endIndex != -1) {
70+
ExtendsElement = jsonContent.Substring(startIndex, endIndex - startIndex)?.Trim();
71+
}
72+
}
73+
if (startIndex == -1 || endIndex == -1 || string.IsNullOrEmpty(ExtendsElement))
74+
Log.LogError($"Failed to find extends element in workload json '{JsonFilePath}'");
75+
]]>
76+
</Code>
77+
</Task>
78+
</UsingTask>
79+
80+
<Target Name="InstallManifestAndDependencies"
81+
DependsOnTargets="_GetDefaultPackageVersion">
82+
<PropertyGroup>
83+
<_LocalSdkManifestsFolder>$(BuildOutputDirectory)lib\sdk-manifests\$(DotNetSdkManifestsFolder)\</_LocalSdkManifestsFolder>
84+
<_LocalAndroidManifestFolder>$(_LocalSdkManifestsFolder)microsoft.net.sdk.android\$(AndroidPackVersionLong)\</_LocalAndroidManifestFolder>
85+
<_EmptyWorkloadDir>$(_LocalSdkManifestsFolder)android.deps.workload\0.0.1\</_EmptyWorkloadDir>
86+
</PropertyGroup>
87+
88+
<MakeDir Directories="$(_LocalAndroidManifestFolder)" />
89+
<MSBuild
90+
Projects="$(MSBuildThisFileDirectory)Microsoft.NET.Sdk.Android.proj"
91+
Properties="WorkloadManifestJsonPath=$(_LocalAndroidManifestFolder)WorkloadManifest.json;WorkloadManifestTargetsPath=$(_LocalAndroidManifestFolder)WorkloadManifest.targets;WorkloadVersion=$(AndroidPackVersion)"
92+
Targets="_GenerateXAWorkloadContent"
93+
/>
94+
95+
<GetAndroidWorkloadExtends JsonFilePath="$(_LocalAndroidManifestFolder)WorkloadManifest.json">
96+
<Output TaskParameter="ExtendsElement" PropertyName="AndroidWorkloadExtendsElement" />
97+
</GetAndroidWorkloadExtends>
98+
99+
<PropertyGroup>
100+
<_EmptyWorkloadJsonContent>
101+
<![CDATA[
102+
{"version": "0.0.1", "workloads": { "android-deps": { "extends" : [ $(AndroidWorkloadExtendsElement) ] } } }
103+
]]>
104+
</_EmptyWorkloadJsonContent>
105+
</PropertyGroup>
106+
107+
<!-- Create empty workload to install dotnet/runtime dependencies, and then clean up the workload and metadata files from install -->
108+
<Error Condition=" '$(AndroidWorkloadExtendsElement)' == '' " Text="Failed to find extends element in workload json" />
109+
<MakeDir Directories="$(_EmptyWorkloadDir)" />
110+
<WriteLinesToFile
111+
File="$(_EmptyWorkloadDir)WorkloadManifest.json"
112+
Lines="$(_EmptyWorkloadJsonContent)"
113+
Overwrite="true"
114+
/>
115+
<Exec
116+
Command="&quot;$(DotNetPreviewTool)&quot; workload install android-deps --configfile &quot;$(XamarinAndroidSourcePath)NuGet.config&quot; --skip-manifest-update --skip-sign-check --verbosity diag"
117+
EnvironmentVariables="DOTNETSDK_WORKLOAD_MANIFEST_ROOTS=$(BuildOutputDirectory)lib\sdk-manifests"
118+
WorkingDirectory="$(XamarinAndroidSourcePath)"
119+
/>
120+
<RemoveDir Directories="$(_EmptyWorkloadDir)" />
121+
</Target>
122+
123+
<PropertyGroup>
124+
<ConfigureLocalWorkloadDependsOn Condition="'$(RunningOnCI)' != 'true'">CreateLocalFrameworkLists;CreateLocalRuntimeLists;InstallManifestAndDependencies;DeleteExtractedWorkloadPacks;PackLocalTemplates</ConfigureLocalWorkloadDependsOn>
125+
</PropertyGroup>
126+
<Target Name="ConfigureLocalWorkload" DependsOnTargets="$(ConfigureLocalWorkloadDependsOn)" />
127+
128+
</Project>

build-tools/create-packs/Directory.Build.targets

Lines changed: 1 addition & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -213,90 +213,6 @@
213213
</Target>
214214

215215
<!-- Targets for setting up a local workload test environment without needing to pack .nupkg files -->
216-
<ItemGroup>
217-
<_FrameworkListInputs Include="$(MicrosoftAndroidRefPackDir)**" />
218-
<_FrameworkListOutputs Include="$(BuildOutputDirectory)lib\packs\Microsoft.Android.Ref.$(AndroidDefaultTargetDotnetApiLevel)\$(AndroidPackVersion)\data\FrameworkList.xml" />
219-
<_FrameworkListOutputs Include="$(BuildOutputDirectory)lib\packs\Microsoft.Android.Ref.$(AndroidLatestStableApiLevel)\$(AndroidPackVersion)\data\FrameworkList.xml" />
220-
<_FrameworkListOutputs Include="$(BuildOutputDirectory)lib\packs\Microsoft.Android.Ref.$(AndroidLatestUnstableApiLevel)\$(AndroidPackVersion)\data\FrameworkList.xml" />
221-
<_RuntimeListInputs Include="$(MicrosoftAndroidArmPackDir)**" />
222-
<_RuntimeListInputs Include="$(MicrosoftAndroidArm64PackDir)**" />
223-
<_RuntimeListInputs Include="$(MicrosoftAndroidx86PackDir)**" />
224-
<_RuntimeListInputs Include="$(MicrosoftAndroidx64PackDir)**" />
225-
<_RuntimeListOutputs Include="@(AndroidSupportedTargetJitAbi->'$(BuildOutputDirectory)lib\packs\Microsoft.Android.Runtime.$(AndroidDefaultTargetDotnetApiLevel).%(AndroidRID)\$(AndroidPackVersion)\data\RuntimeList.xml')" AndroidRID="%(AndroidRID)" />
226-
<_RuntimeListOutputs Include="@(AndroidSupportedTargetJitAbi->'$(BuildOutputDirectory)lib\packs\Microsoft.Android.Runtime.$(AndroidLatestStableApiLevel).%(AndroidRID)\$(AndroidPackVersion)\data\RuntimeList.xml')" AndroidRID="%(AndroidRID)" />
227-
<_RuntimeListOutputs Include="@(AndroidSupportedTargetJitAbi->'$(BuildOutputDirectory)lib\packs\Microsoft.Android.Runtime.$(AndroidLatestUnstableApiLevel).%(AndroidRID)\$(AndroidPackVersion)\data\RuntimeList.xml')" AndroidRID="%(AndroidRID)" />
228-
<_TemplatesInputs Include="$(XamarinAndroidSourcePath)src\Microsoft.Android.Templates\**" />
229-
<_TemplatesOutputs Include="$(BuildOutputDirectory)lib\template-packs\microsoft.android.templates.$(AndroidPackVersion).nupkg" />
230-
</ItemGroup>
231-
232-
<Target Name="CreateLocalRuntimeLists"
233-
Inputs="$(MSBuildThisFile);@(_RuntimeListInputs)"
234-
Outputs="@(_RuntimeListOutputs)">
235-
<MSBuild
236-
Projects="$(MSBuildThisFileDirectory)Microsoft.Android.Runtime.proj"
237-
Properties="FrameworkListFile=%(_RuntimeListOutputs.Identity);AndroidRID=%(_RuntimeListOutputs.AndroidRID)"
238-
Targets="_GetRuntimePackItems;_GenerateFrameworkListFile"
239-
/>
240-
</Target>
241-
242-
<Target Name="CreateLocalFrameworkLists"
243-
Inputs="$(MSBuildThisFile);@(_FrameworkListInputs)"
244-
Outputs="@(_FrameworkListOutputs)">
245-
<MSBuild
246-
Projects="$(MSBuildThisFileDirectory)Microsoft.Android.Ref.proj"
247-
Properties="FrameworkListFile=%(_FrameworkListOutputs.Identity)"
248-
Targets="_GetTargetingPackItems;_GenerateFrameworkListFile"
249-
/>
250-
</Target>
251-
252-
<Target Name="PackAndCopyTemplates"
253-
Inputs="@(_TemplatesInputs)"
254-
Outputs="@(_TemplatesOutputs)">
255-
<ItemGroup>
256-
<_PackProps Include="-v:n -c $(Configuration)" />
257-
<_PackProps Include="-p:IncludeSymbols=False" />
258-
<_PackProps Include="-p:OutputPath=$(DotNetPreviewPath)template-packs" />
259-
<_PackProps Include="-p:TemplatePackVersion=$(AndroidPackVersion)" />
260-
<_PackProps Include="-p:PackageId=microsoft.android.templates" />
261-
</ItemGroup>
262-
<Exec Command="&quot;$(DotNetPreviewTool)&quot; pack @(_PackProps, ' ') &quot;$(XamarinAndroidSourcePath)src\Microsoft.Android.Templates\Microsoft.Android.Templates.csproj&quot;" />
263-
</Target>
264-
265-
<Target Name="InstallManifestAndDependencies"
266-
DependsOnTargets="DeleteExtractedWorkloadPacks;_GetDefaultPackageVersion">
267-
<PropertyGroup>
268-
<_LocalSdkManifestsFolder>$(BuildOutputDirectory)lib\sdk-manifests\$(DotNetSdkManifestsFolder)\</_LocalSdkManifestsFolder>
269-
<_LocalAndroidManifestFolder>$(_LocalSdkManifestsFolder)microsoft.net.sdk.android\$(AndroidPackVersionLong)\</_LocalAndroidManifestFolder>
270-
<_EmptyWorkloadDir>$(_LocalSdkManifestsFolder)android.deps.workload\0.0.1\</_EmptyWorkloadDir>
271-
<_EmptyWorkloadJsonContent>
272-
<![CDATA[
273-
{"version": "0.0.1", "workloads": { "android-deps": { "extends" : [ "microsoft-net-runtime-android", "microsoft-net-runtime-android-aot" ] } } }
274-
]]>
275-
</_EmptyWorkloadJsonContent>
276-
</PropertyGroup>
277-
<MakeDir Directories="$(_LocalAndroidManifestFolder)" />
278-
<MSBuild
279-
Projects="$(MSBuildThisFileDirectory)Microsoft.NET.Sdk.Android.proj"
280-
Properties="WorkloadManifestJsonPath=$(_LocalAndroidManifestFolder)WorkloadManifest.json;WorkloadManifestTargetsPath=$(_LocalAndroidManifestFolder)WorkloadManifest.targets;WorkloadVersion=$(AndroidPackVersion)"
281-
Targets="_GenerateXAWorkloadContent"
282-
/>
283-
<!-- Create empty workload to install dotnet/runtime dependencies -->
284-
<MakeDir Directories="$(_EmptyWorkloadDir)" />
285-
<WriteLinesToFile
286-
File="$(_EmptyWorkloadDir)WorkloadManifest.json"
287-
Lines="$(_EmptyWorkloadJsonContent)"
288-
Overwrite="true"
289-
/>
290-
<Exec
291-
Command="&quot;$(DotNetPreviewTool)&quot; workload install android-deps --configfile &quot;$(XamarinAndroidSourcePath)NuGet.config&quot; --skip-manifest-update --skip-sign-check --verbosity diag"
292-
EnvironmentVariables="DOTNETSDK_WORKLOAD_MANIFEST_ROOTS=$(BuildOutputDirectory)lib\sdk-manifests"
293-
WorkingDirectory="$(XamarinAndroidSourcePath)"
294-
/>
295-
</Target>
296-
297-
<PropertyGroup>
298-
<ConfigureLocalWorkloadDependsOn Condition="'$(RunningOnCI)' != 'true'">CreateLocalFrameworkLists;CreateLocalRuntimeLists;PackAndCopyTemplates;InstallManifestAndDependencies</ConfigureLocalWorkloadDependsOn>
299-
</PropertyGroup>
300-
<Target Name="ConfigureLocalWorkload" DependsOnTargets="$(ConfigureLocalWorkloadDependsOn)" />
216+
<Import Project="ConfigureLocalWorkload.targets" />
301217

302218
</Project>

0 commit comments

Comments
 (0)