From 626bfba34365db5c48ef957ef62c7c11b5471fda Mon Sep 17 00:00:00 2001 From: Emanuel Fernandez Dell'Oca Date: Fri, 1 Aug 2025 10:55:08 -0400 Subject: [PATCH 1/3] [Windows] Skip running tasks with no inputs This is a very minor perf improvements that could help when building remotely from Windows with slow connections (i.e., from Devbox). It skips running some tasks that not always have inputs to avoid the unnecessary network round tripping. --- dotnet/targets/Xamarin.Shared.Sdk.targets | 5 +++-- .../Xamarin.iOS.Common.After.targets | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index 55a3b2b799bc..1408c8d0f73b 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -856,7 +856,7 @@ @@ -873,7 +873,7 @@ --> - Date: Fri, 1 Aug 2025 13:00:58 -0400 Subject: [PATCH 2/3] Add checks to tasks instead of targets --- dotnet/targets/Xamarin.Shared.Sdk.targets | 5 ++--- msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx | 8 ++++++++ msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs | 8 ++++++-- .../Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs | 5 +++++ .../Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs | 5 +++++ msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs | 7 ++++++- .../Xamarin.iOS.Common.After.targets | 2 +- 7 files changed, 33 insertions(+), 7 deletions(-) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index 1408c8d0f73b..55a3b2b799bc 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -856,7 +856,7 @@ @@ -873,7 +873,7 @@ --> + + + Skipping {0} - {1} is empty. + + {0}: the name of the MSBuild task that's being skipped (Copy, GetFullPaths, FilterStaticFrameworks, etc.). + {1}: the name of the property that is empty (SourceFiles, Items, FrameworkToPublish, etc.). + + diff --git a/msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs b/msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs index 3679d861f69e..6aacd7cea5f4 100644 --- a/msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs +++ b/msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs @@ -1,11 +1,10 @@ extern alias Microsoft_Build_Tasks_Core; -using System; -using System.IO; using System.Linq; using Microsoft.Build.Framework; +using Xamarin.Localization.MSBuild; using Xamarin.Messaging.Build.Client; namespace Microsoft.Build.Tasks { @@ -13,6 +12,11 @@ public class Copy : Microsoft_Build_Tasks_Core::Microsoft.Build.Tasks.Copy { public string SessionId { get; set; } = string.Empty; public override bool Execute () { + if (SourceFiles?.Any () != true) { + Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof(Copy), nameof(SourceFiles)); + return true; + } + if (!this.ShouldExecuteRemotely (SessionId)) return base.Execute (); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs index e9f5c2903ee0..23500a9ea51c 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs @@ -22,6 +22,11 @@ public class FilterStaticFrameworks : XamarinTask, ITaskCallback { public override bool Execute () { + if (FrameworkToPublish?.Any () != true) { + Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof(FilterStaticFrameworks), nameof(FrameworkToPublish)); + return true; + } + if (ShouldExecuteRemotely ()) return new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs index cd40fe3d4a59..d4c3969124e3 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs @@ -43,6 +43,11 @@ public class GetFileSystemEntries : XamarinTask, ICancelableTask, ITaskCallback public override bool Execute () { + if (DirectoryPath?.Any () != true) { + Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof(GetFileSystemEntries), nameof(DirectoryPath)); + return true; + } + if (ShouldExecuteRemotely ()) return new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs index 000b66f2c08a..9440c379e5f5 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs @@ -6,7 +6,7 @@ using Microsoft.Build.Framework; using Microsoft.Build.Utilities; -using Xamarin.MacDev.Tasks; +using Xamarin.Localization.MSBuild; using Xamarin.Messaging.Build.Client; #nullable enable @@ -23,6 +23,11 @@ public class GetFullPaths : XamarinTask, ICancelableTask, ITaskCallback { public override bool Execute () { + if (Items?.Any () != true) { + Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof(GetFullPaths), nameof(Items)); + return true; + } + if (ShouldExecuteRemotely ()) return new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result; diff --git a/msbuild/Xamarin.iOS.Tasks.Windows/Xamarin.iOS.Common.After.targets b/msbuild/Xamarin.iOS.Tasks.Windows/Xamarin.iOS.Common.After.targets index bb0bef989f19..781953fb30e3 100644 --- a/msbuild/Xamarin.iOS.Tasks.Windows/Xamarin.iOS.Common.After.targets +++ b/msbuild/Xamarin.iOS.Tasks.Windows/Xamarin.iOS.Common.After.targets @@ -306,7 +306,7 @@ Copyright (C) 2011-2013 Xamarin. All rights reserved. destination doesn't exist, the source is newer than the destination, or if the source and destination differ by file size. --> - Date: Fri, 1 Aug 2025 17:04:30 +0000 Subject: [PATCH 3/3] Auto-format source code --- msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs | 2 +- msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs | 2 +- msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs | 2 +- msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs b/msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs index 6aacd7cea5f4..089e2f16ba09 100644 --- a/msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs +++ b/msbuild/Xamarin.MacDev.Tasks/MsBuildTasks/Copy.cs @@ -13,7 +13,7 @@ public class Copy : Microsoft_Build_Tasks_Core::Microsoft.Build.Tasks.Copy { public override bool Execute () { if (SourceFiles?.Any () != true) { - Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof(Copy), nameof(SourceFiles)); + Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof (Copy), nameof (SourceFiles)); return true; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs index 23500a9ea51c..8d4f3bfe5376 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/FilterStaticFrameworks.cs @@ -23,7 +23,7 @@ public class FilterStaticFrameworks : XamarinTask, ITaskCallback { public override bool Execute () { if (FrameworkToPublish?.Any () != true) { - Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof(FilterStaticFrameworks), nameof(FrameworkToPublish)); + Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof (FilterStaticFrameworks), nameof (FrameworkToPublish)); return true; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs index d4c3969124e3..aa00104501cd 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFileSystemEntries.cs @@ -44,7 +44,7 @@ public class GetFileSystemEntries : XamarinTask, ICancelableTask, ITaskCallback public override bool Execute () { if (DirectoryPath?.Any () != true) { - Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof(GetFileSystemEntries), nameof(DirectoryPath)); + Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof (GetFileSystemEntries), nameof (DirectoryPath)); return true; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs index 9440c379e5f5..944e984afb31 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetFullPaths.cs @@ -24,7 +24,7 @@ public class GetFullPaths : XamarinTask, ICancelableTask, ITaskCallback { public override bool Execute () { if (Items?.Any () != true) { - Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof(GetFullPaths), nameof(Items)); + Log.LogMessage (MessageImportance.Low, MSBStrings.M7159 /* Skipping {0} - {1} is empty. */, nameof (GetFullPaths), nameof (Items)); return true; }