Skip to content

Commit

Permalink
[workload] move SingleProject.targets to Microsoft.Maui.Sdk
Browse files Browse the repository at this point in the history
Fixes: https://dev.azure.com/devdiv/DevDiv/_workitems/edit/1428787

Currently, if you mimic a design-time build that would happen inside
Visual Studio:

    > dotnet new maui
    > dotnet build -f net6.0-android -t:Compile -p:DesignTimeBuild=true -p:BuildingInsideVisualStudio=true -p:SkipCompilerExecution=true --no-restore

This fails because of the `--no-restore` flag:

    C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\31.0.101-preview.11.74\tools\Xamarin.Android.Common.targets(511,3):
    error XA1018: Specified AndroidManifest file does not exist: foo\AndroidManifest.xml.

I was able to reproduce this failure in our template tests in
`dotnet.cake`.

In 974cac4, several of .NET MAUI's MSBuild targets were moved to
`library-packs`, such as `Microsoft.Maui.Controls.Build.Tasks`. This
means that files like `Microsoft.Maui.Controls.SingleProject.targets`
won't be evaluated until NuGet restore completes.

To solve this problem:

* Move `Microsoft.Maui.Controls.SingleProject.targets` and
  `Microsoft.Maui.Controls.DefaultItems.targets` to the
  `Microsoft.Maui.Sdk` pack. These `.targets` are no longer affected by
  `$(MauiVersion)`, and just exist in the workload.

* Stop importing these files in `Microsoft.Maui.Controls.targets` in
  `Microsoft.Maui.Controls.Build.Tasks`.

* Import these files in `Microsoft.Maui.Sdk.After.targets`.

Overall, I think the loss of `$(MauiVersion)` is fine for the moved
`.targets` files, because they are not invoking MSBuild tasks.

The design-time build tests now complete successfully.
  • Loading branch information
jonathanpeppers committed Nov 5, 2021
1 parent a13e89d commit 09c27f5
Show file tree
Hide file tree
Showing 17 changed files with 84 additions and 29 deletions.
2 changes: 0 additions & 2 deletions .nuspec/Microsoft.Maui.Controls.targets
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
<AndroidUseDefaultAotProfile Condition="'$(AndroidEnableProfiledAot)' == 'true' and '$(AndroidUseDefaultAotProfile)' == ''">false</AndroidUseDefaultAotProfile>
</PropertyGroup>

<Import Project="$(MSBuildThisFileDirectory)Microsoft.Maui.Controls.DefaultItems.targets" Condition="'$(MSBuildSDKsPath)'!=''" />

<ItemGroup>
<ProjectCapability Include="Maui" Condition="'$(_ExcludeMauiProjectCapability)' != 'true'" />
<AvailableItemName Include="MauiXaml" />
Expand Down
67 changes: 57 additions & 10 deletions eng/cake/dotnet.cake
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,16 @@ Task("dotnet-templates")
FileWriteText(File("../templatesTest/Directory.Build.targets"), "<Project/>");
CopyFileToDirectory(File("./NuGet.config"), Directory("../templatesTest/"));

// See: https://github.com/dotnet/project-system/blob/main/docs/design-time-builds.md
var designTime = new Dictionary<string, string> {
{ "DesignTimeBuild", "true" },
{ "BuildingInsideVisualStudio", "true" },
{ "SkipCompilerExecution", "true" },
// NOTE: this overrides a default setting that supports VS Mac
// See: https://github.com/xamarin/xamarin-android/blob/94c2a3d86a2e0e74863b57e3c5c61dbd29daa9ea/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in#L19
{ "AndroidUseManagedDesignTimeResourceGenerator", "true" },
};

var properties = new Dictionary<string, string> {
// Properties that ensure we don't use cached packages, and *only* the empty NuGet.config
{ "RestoreNoCache", "true" },
Expand All @@ -97,11 +107,24 @@ Task("dotnet-templates")
{ "CustomBeforeMicrosoftCSharpTargets", MakeAbsolute(File("./src/Templates/TemplateTestExtraTargets.targets")).FullPath },
};

var frameworks = new [] {
"net6.0-android",
"net6.0-ios",
"net6.0-maccatalyst",
};

foreach (var template in new [] { "maui", "maui-blazor", "mauilib" })
{
var name = template.Replace("-", "") + " Space-Dash";
StartProcess(dn, $"new {template} -o \"../templatesTest/{name}\"");

// Design-time build without restore
foreach (var framework in frameworks)
{
RunMSBuildWithDotNet($"../templatesTest/{name}", designTime, target: "Compile", restore: false, warningsAsError: true, targetFramework: framework);
}

// Build
RunMSBuildWithDotNet($"../templatesTest/{name}", properties, warningsAsError: true);
}
});
Expand Down Expand Up @@ -231,7 +254,7 @@ Task("SAMPLE-ANDROID")
.IsDependentOn("dotnet-buildtasks")
.Does(() =>
{
RunMSBuildWithDotNet("./src/Controls/samples/Controls.Sample.Droid/Maui.Controls.Sample.Droid-net6.csproj", deployAndRun: true);
RunMSBuildWithDotNet("./src/Controls/samples/Controls.Sample.Droid/Maui.Controls.Sample.Droid-net6.csproj", target: "Run");
});

Task("SAMPLE-IOS")
Expand All @@ -240,7 +263,7 @@ Task("SAMPLE-IOS")
.IsDependentOn("dotnet-buildtasks")
.Does(() =>
{
RunMSBuildWithDotNet("./src/Controls/samples/Controls.Sample.iOS/Maui.Controls.Sample.iOS-net6.csproj", deployAndRun: true);
RunMSBuildWithDotNet("./src/Controls/samples/Controls.Sample.iOS/Maui.Controls.Sample.iOS-net6.csproj", target: "Run");
});

Task("SAMPLE-MAC")
Expand All @@ -249,7 +272,7 @@ Task("SAMPLE-MAC")
.IsDependentOn("dotnet-buildtasks")
.Does(() =>
{
RunMSBuildWithDotNet("./src/Controls/samples/Controls.Sample.MacCatalyst/Maui.Controls.Sample.MacCatalyst-net6.csproj", deployAndRun: true);
RunMSBuildWithDotNet("./src/Controls/samples/Controls.Sample.MacCatalyst/Maui.Controls.Sample.MacCatalyst-net6.csproj", target: "Run");
});


Expand Down Expand Up @@ -331,19 +354,28 @@ void StartVisualStudioForDotNet6(string sln = null)

// NOTE: These methods work as long as the "dotnet" target has already run

void RunMSBuildWithDotNet(string sln, Dictionary<string, string> properties = null, bool deployAndRun = false, bool warningsAsError = false)
void RunMSBuildWithDotNet(
string sln,
Dictionary<string, string> properties = null,
string target = "Build",
bool warningsAsError = false,
bool restore = true,
string targetFramework = null)
{
var name = System.IO.Path.GetFileNameWithoutExtension(sln);
var binlog = $"\"{logDirectory}/{name}-{configuration}.binlog\"";
var binlog = string.IsNullOrEmpty(targetFramework) ?
$"\"{logDirectory}/{name}-{configuration}-{target}.binlog\"" :
$"\"{logDirectory}/{name}-{configuration}-{target}-{targetFramework}.binlog\"";

if(localDotnet)
SetDotNetEnvironmentVariables();

// If we're not on Windows, use ./bin/dotnet/dotnet
if (!IsRunningOnWindows() || deployAndRun)
if (!IsRunningOnWindows() || target == "Run")
{
var msbuildSettings = new DotNetCoreMSBuildSettings()
.SetConfiguration(configuration)
.WithTarget(target)
.EnableBinaryLogger(binlog);
if (warningsAsError)
{
Expand All @@ -358,13 +390,20 @@ void RunMSBuildWithDotNet(string sln, Dictionary<string, string> properties = nu
}
}

if (deployAndRun)
msbuildSettings.WithTarget("Run");

var dotnetBuildSettings = new DotNetCoreBuildSettings
{
MSBuildSettings = msbuildSettings,
};
dotnetBuildSettings.ArgumentCustomization = args =>
{
if (!restore)
args.Append("--no-restore");

if (!string.IsNullOrEmpty(targetFramework))
args.Append($"-f {targetFramework}");

return args;
};

if (localDotnet)
dotnetBuildSettings.ToolPath = dotnetPath;
Expand All @@ -377,13 +416,21 @@ void RunMSBuildWithDotNet(string sln, Dictionary<string, string> properties = nu
var msbuild = FindMSBuild();
Information("Using MSBuild: {0}", msbuild);
var msbuildSettings = new MSBuildSettings { ToolPath = msbuild }
.WithRestore()
.SetConfiguration(configuration)
.WithTarget(target)
.EnableBinaryLogger(binlog);
if (warningsAsError)
{
msbuildSettings.WarningsAsError = true;
}
if (restore)
{
msbuildSettings.WithRestore();
}
if (!string.IsNullOrEmpty(targetFramework))
{
msbuildSettings.WithProperty("TargetFramework", targetFramework);
}

if (properties != null)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<Project>
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.Build.Tasks.dll')" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.dll')" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Core.targets" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<Project>
<Import Project="..\.nuspec\Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.Build.Tasks.dll')" />
<Import Project="..\.nuspec\Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="..\.nuspec\Microsoft.Maui.Controls.DefaultItems.targets" />
<ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included -->
<ProjectReference Include="..\Microsoft.Maui.Controls\Microsoft.Maui.Controls.csproj" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<Import Project="..\Nuget.targets" Condition="$(FromSource) == 'false'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.Build.Tasks.dll')" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.dll')" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Core.targets" />
Expand Down
1 change: 1 addition & 0 deletions src/Controls/samples/Maui.InTree.targets
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<Project>
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.Build.Tasks.dll')" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.dll')" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Core.targets" />
Expand Down
2 changes: 0 additions & 2 deletions src/Controls/src/Build.Tasks/Controls.Build.Tasks-net6.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@
</ItemGroup>

<ItemGroup>
<_Files Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.SingleProject.targets" />
<_Files Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.DefaultItems.targets" />
<_Files Include="$(PkgMicrosoft_Maui_Graphics)\lib\netstandard2.0\Microsoft.Maui.Graphics.dll" />
<_Files Include="$(PkgMicrosoft_Maui_Graphics)\lib\netstandard2.0\Microsoft.Maui.Graphics.pdb" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.dll" />
Expand Down
2 changes: 0 additions & 2 deletions src/Controls/src/Build.Tasks/Controls.Build.Tasks.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
</PropertyGroup>

<ItemGroup>
<_Files Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.SingleProject.targets" />
<_Files Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.DefaultItems.targets" />
<_Files Include="$(PkgMicrosoft_Maui_Graphics)\lib\netstandard2.0\Microsoft.Maui.Graphics.dll" />
<_Files Include="$(PkgMicrosoft_Maui_Graphics)\lib\netstandard2.0\Microsoft.Maui.Graphics.pdb" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.dll" />
Expand Down
1 change: 1 addition & 0 deletions src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
</ItemGroup>

<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Core.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.TestUtils.DeviceTests.Runners.targets" />

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<Project>
<Import Project="..\..\..\..\..\..\..\..\..\.nuspec\Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.Build.Tasks.dll')" />
<Import Project="..\..\..\..\..\..\..\..\..\.nuspec\Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="..\..\..\..\..\..\..\..\..\.nuspec\Microsoft.Maui.Controls.DefaultItems.targets" />
</Project>
7 changes: 4 additions & 3 deletions src/Core/tests/DeviceTests/Core.DeviceTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,9 @@
<Compile Remove="**\*.Windows.cs" />
</ItemGroup>

<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Controls.targets" />
<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Core.targets" />
<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.TestUtils.DeviceTests.Runners.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Core.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.TestUtils.DeviceTests.Runners.targets" />

</Project>
1 change: 1 addition & 0 deletions src/Essentials/samples/Maui.InTree.targets
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<Project>
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.Build.Tasks.dll')" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true' AND Exists('$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.dll')" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Resizetizer.targets" Condition="'$(BuildingInsideVisualStudio)' != 'true'" />
<Import Project="$(_MauiBuildTasksLocation)Microsoft.Maui.Core.targets" />
Expand Down
7 changes: 4 additions & 3 deletions src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@
<Compile Remove="**\Windows\**\*.cs" />
</ItemGroup>

<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Controls.targets" />
<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Core.targets" />
<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.TestUtils.DeviceTests.Runners.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Core.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.TestUtils.DeviceTests.Runners.targets" />

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@
<UseInterpreter Condition="$(TargetFramework.Contains('-android'))">true</UseInterpreter>
</PropertyGroup>

<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Controls.targets" />
<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Core.targets" />
<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.TestUtils.DeviceTests.Runners.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Core.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.TestUtils.DeviceTests.Runners.targets" />

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,10 @@
</Compile>
</ItemGroup>

<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Controls.targets" />
<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Core.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.DefaultItems.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Core.targets" />

<Import Project="..\..\..\..\.nuspec\Microsoft.Maui.Controls.MultiTargeting.targets" />
<Import Project="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.MultiTargeting.targets" />

</Project>
4 changes: 3 additions & 1 deletion src/Workload/Microsoft.Maui.Sdk/Microsoft.Maui.Sdk.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
<ItemGroup>
<None Remove="**/*.in.*" />
<None Update="@(None)" PackagePath="" />
<None Include="@(_Files)" PackagePath="targets" Link="targets/%(FileName)%(Extension)" Visible="false" />
<_Files Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.SingleProject.targets" />
<_Files Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.DefaultItems.targets" />
<None Include="@(_Files)" PackagePath="Sdk" Link="Sdk/%(FileName)%(Extension)" Visible="false" />
<None Update="@(None)" CopyToOutputDirectory="PreserveNewest" Pack="true" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@
<ProjectCapability Include="MauiCore" Condition=" '$(UseMaui)' == 'true' or '$(UseMauiCore)' == 'true' " />
<ProjectCapability Include="MauiEssentials" Condition=" '$(UseMaui)' == 'true' or '$(UseMauiEssentials)' == 'true' " />
</ItemGroup>
<Import Project="Microsoft.Maui.Controls.DefaultItems.targets" />
</Project>

0 comments on commit 09c27f5

Please sign in to comment.