Skip to content

Commit

Permalink
[workload] move all build tasks out of library-packs
Browse files Browse the repository at this point in the history
Fixes: https://dev.azure.com/devdiv/DevDiv/_workitems/edit/1459138
Fixes: dotnet#4098

This partially reverts 974cac4.

Creating a new MAUI solution, results in several intellisense errors:

    CS0103: The name 'InitializeComponent` does not exist in the current context.

The missing members are created by the (previously XamlG) Roslyn
source generator. You can go-to definition the missing members, build
& run works, and if you close/reopen the solution the errors go away.
Unchecking the `Run code analysis in a separate process`, also seems
to solve the issue.

.NET MAUI seems to be using an intersection of features that causes
this problem:

1. We have a `dotnet new maui` project template.
2. We have a source generator in a NuGet package.
3. We have MSBuild targets that setup the source generator in a NuGet
   package.
4. We use `AdditionalFiles` to pass `.xaml` files in to the source
   generator.

What happens on the first project load, the design-time builds
*before* project restore are missing the source generator. So the call
to `<Csc/>` does not have `@(Analyzer)` or `AdditionalFiles` at all.

To solve this issue, we can move everything *out* of NuGet packages,
so they become regular "SDK" or workload packs:

* `Microsoft.Maui.Controls.Build.Tasks` is no longer packable
    * all files moved to `Microsoft.Maui.Sdk`
* `Resizetizer.csproj` is no longer packable
    * actual files are in `Microsoft.Maui.Resizetizer.Sdk`
* `$(MauiVersion)` no longer applies to build tasks

Testing locally, this seems to solve the problem for me. I can see the
`@(Analyzer)` and `AdditionalFiles` being passed on all design-time
builds now.

Other changes:

* I added `%(IsImplicitlyDefined)` to the source generator assembly. I
  just noticed this was missing while reading `.binlog` files.
* I put all files in the `Sdk` folder in `Microsoft.Maui.Sdk`. This
  seems a bit simpler to have one directory.
  • Loading branch information
jonathanpeppers committed Jan 20, 2022
1 parent 8966710 commit b2596b9
Show file tree
Hide file tree
Showing 14 changed files with 57 additions and 84 deletions.
4 changes: 2 additions & 2 deletions .nuspec/Microsoft.Maui.Controls.targets
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<UsingTask TaskName="Microsoft.Maui.Controls.Build.Tasks.XamlCTask" AssemblyFile="$(MSBuildThisFileDirectory)Microsoft.Maui.Controls.Build.Tasks.dll" />

<PropertyGroup>
<_MinimumMauiWorkloadVersion>6.0.100-rc.2</_MinimumMauiWorkloadVersion>
<_MinimumMauiWorkloadVersion>6.0.200</_MinimumMauiWorkloadVersion>
<SynthesizeLinkMetadata>true</SynthesizeLinkMetadata>
<EnableDefaultXamlItems Condition="'$(EnableDefaultXamlItems)'==''">True</EnableDefaultXamlItems>
<EnableDefaultCssItems Condition="'$(EnableDefaultCssItems)'==''">True</EnableDefaultCssItems>
Expand All @@ -20,7 +20,7 @@
</ItemGroup>

<ItemGroup Condition=" '$(DisableMauiAnalyzers)' != 'true' ">
<Analyzer Include="$(MSBuildThisFileDirectory)Microsoft.Maui.Controls.SourceGen.dll" />
<Analyzer Include="$(MSBuildThisFileDirectory)Microsoft.Maui.Controls.SourceGen.dll" IsImplicitlyDefined="true" />
</ItemGroup>

<ItemGroup Condition="'$(AndroidEnableProfiledAot)' == 'true' and '$(MauiUseDefaultAotProfile)' != 'false'">
Expand Down
46 changes: 2 additions & 44 deletions src/Controls/src/Build.Tasks/Controls.Build.Tasks-net6.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,48 +8,15 @@
<Description>.NET MAUI MSBuild tasks. Enabled via &lt;UseMaui&gt;true&lt;/UseMaui&gt;.</Description>
<TargetFramework>netstandard2.0</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<IsTrimmable>false</IsTrimmable>
<IncludeSymbols>false</IncludeSymbols>
<IncludeBuildOutput>false</IncludeBuildOutput>
<NoWarn>NU5128</NoWarn>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Mono.Cecil" Version="0.11.3" GeneratePathProperty="true" />
<PackageReference Include="System.CodeDom" GeneratePathProperty="true" />
<PackageReference Include="Mono.Cecil" Version="0.11.3" />
<PackageReference Include="Microsoft.Build" Version="15.9.20" />
<PackageReference Include="Microsoft.Build.Framework" Version="15.9.20" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.9.20" />
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="15.9.20" />
<PackageReference Include="Microsoft.Maui.Graphics" GeneratePathProperty="true" />
</ItemGroup>

<ItemGroup>
<_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" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.pdb" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Mdb.dll" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Mdb.pdb" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Pdb.dll" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Pdb.pdb" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Rocks.dll" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Rocks.pdb" />
<_Files Include="$(PkgSystem_CodeDom)\lib\netstandard2.0\System.CodeDom.dll" />
<_Files Include="..\Core\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.dll" />
<_Files Include="..\Core\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.pdb" />
<_Files Include="..\Core\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.dll" />
<_Files Include="..\Core\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.pdb" />
<_Files Include="..\Xaml\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.Xaml.dll" />
<_Files Include="..\Xaml\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.Xaml.pdb" />
<_Files Include="..\SourceGen\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.SourceGen.dll" />
<_Files Include="..\SourceGen\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.SourceGen.pdb" />
<None Include="@(_Files)" Visible="false" Pack="true" PackagePath="build" CopyToOutputDirectory="PreserveNewest" />
<None Include="$(OutputPath)$(AssemblyName).dll" Visible="false" Pack="true" PackagePath="build" />
<None Include="$(OutputPath)$(AssemblyName).pdb" Visible="false" Pack="true" PackagePath="build" />
<None Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.props" Visible="false" Pack="true" PackagePath="build\$(PackageId).props" CopyToOutputDirectory="PreserveNewest" />
<None Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.targets" Visible="false" Pack="true" PackagePath="build\$(PackageId).targets" CopyToOutputDirectory="PreserveNewest" />
<None Include="maui.aotprofile" Pack="true" PackagePath="build" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

<ItemGroup>
Expand All @@ -76,17 +43,8 @@
<Target Name="_CopyToNuspecDir" AfterTargets="Build">
<ItemGroup>
<!-- The satellite assemblies need to be added after Build, so they exist -->
<None Include="$(OutputPath)*\$(AssemblyName).resources.dll" Visible="false" Pack="true" PackagePath="build" />
<_CopyItems Include="$(TargetDir)*.dll" Exclude="$(TargetDir)System.*.dll" />
</ItemGroup>
<Copy SourceFiles="@(_CopyItems)" DestinationFolder="$(MauiNuSpecDirectory)" ContinueOnError="true" Retries="0" />
</Target>

<Import Project="$(MauiRootDirectory)src\Workload\Shared\LibraryPacks.targets" />

<ItemGroup>
<!-- Ensure all references are PrivateAssets=all, so they are not transitive to end-user projects. -->
<PackageReference Update="@(PackageReference)" PrivateAssets="all" />
<ProjectReference Update="@(ProjectReference)" PrivateAssets="all" />
</ItemGroup>
</Project>
6 changes: 1 addition & 5 deletions src/SingleProject/Resizetizer/src/Resizetizer.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
<!-- NOTE: This project is temporarily replacing Microsoft.Maui.Resizetizer.Sdk -->
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
Expand All @@ -8,9 +7,7 @@
<!--<Nullable>enable</Nullable>-->
<PackageId>Microsoft.Maui.Resizetizer.Sdk</PackageId>
<Description>.NET MAUI SDK support for images, fonts, etc. Enabled via &lt;UseMauiAssets&gt;true&lt;/UseMauiAssets&gt;.</Description>
<IncludeSymbols>false</IncludeSymbols>
<IncludeBuildOutput>false</IncludeBuildOutput>
<NoWarn>NU5128</NoWarn>
<IsPackable>false</IsPackable>
<_SkiaPackagePath>build\</_SkiaPackagePath>
</PropertyGroup>

Expand All @@ -37,7 +34,6 @@
<Copy SourceFiles="@(_CopyItems)" DestinationFolder="$(MauiNuSpecDirectory)%(RecursiveDir)" ContinueOnError="true" Retries="0" />
</Target>

<Import Project="$(MauiRootDirectory)src\Workload\Shared\LibraryPacks.targets" />
<Import Project="$(MauiRootDirectory)src\Workload\Shared\Svg.Skia.targets" />

</Project>
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
<!-- NOTE: Resizetizer.csproj is temporarily replacing usage of this file -->
<Project Sdk="Microsoft.Build.NoTargets">

<Import Project="../Shared/Common.targets" />
<Import Project="$(MauiRootDirectory)src/SingleProject/Resizetizer/src/ResizetizerPackages.projitems" />

<PropertyGroup>
<IsPackable>false</IsPackable>
<Description>.NET MAUI SDK support for images, fonts, etc. Enabled via &lt;UseMauiAssets&gt;true&lt;/UseMauiAssets&gt;.</Description>
<OutputPath>$(DotNetPacksDirectory)$(PackageId)/$(PackageVersion)/</OutputPath>
</PropertyGroup>
Expand Down
31 changes: 28 additions & 3 deletions src/Workload/Microsoft.Maui.Sdk/Microsoft.Maui.Sdk.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,42 @@
<OutputPath>$(DotNetPacksDirectory)$(PackageId)/$(PackageVersion)/</OutputPath>
</PropertyGroup>

<!-- NOTE: many files temporarily moved to Controls.Build.Tasks-net6.csproj -->
<ItemGroup>
<None Remove="**/*.in.*" />
<None Update="@(None)" PackagePath="" />
<_Files Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.props" />
<_Files Include="$(MauiNuSpecDirectory)Microsoft.Maui.Controls.targets" />
<_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" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.pdb" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Mdb.dll" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Mdb.pdb" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Pdb.dll" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Pdb.pdb" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Rocks.dll" />
<_Files Include="$(PkgMono_Cecil)\lib\netstandard2.0\Mono.Cecil.Rocks.pdb" />
<_Files Include="$(PkgSystem_CodeDom)\lib\netstandard2.0\System.CodeDom.dll" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\Build.Tasks\bin\Debug\netstandard2.0\Microsoft.Maui.Controls.Build.Tasks.dll" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\Build.Tasks\bin\Debug\netstandard2.0\*\Microsoft.Maui.Controls.Build.Tasks.resources.dll" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\Core\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.dll" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\Core\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.pdb" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\Core\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.dll" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\Core\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.pdb" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\Xaml\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.Xaml.dll" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\Xaml\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.Xaml.pdb" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\SourceGen\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.SourceGen.dll" />
<_Files Include="$(MauiRootDirectory)src\Controls\src\SourceGen\bin\$(Configuration)\netstandard2.0\Microsoft.Maui.Controls.SourceGen.pdb" />
<None Include="@(_Files)" PackagePath="Sdk" Link="Sdk/%(FileName)%(Extension)" Visible="false" />
<None Update="@(None)" CopyToOutputDirectory="PreserveNewest" Pack="true" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Maui.Graphics" GeneratePathProperty="true" />
<PackageReference Include="Mono.Cecil" Version="0.11.3" GeneratePathProperty="true" />
<PackageReference Include="System.CodeDom" GeneratePathProperty="true" />
<ProjectReference Include="$(MauiRootDirectory)src/Controls/src/Build.Tasks/Controls.Build.Tasks-net6.csproj" />
<ProjectReference Include="$(MauiRootDirectory)src/Controls/src/SourceGen/Controls.SourceGen.csproj" />
</ItemGroup>
Expand All @@ -38,10 +63,10 @@
<ItemGroup>
<None
Include="$(IntermediateOutputPath)BundledVersions.targets"
Link="targets/BundledVersions.targets"
Link="Sdk/BundledVersions.targets"
CopyToOutputDirectory="PreserveNewest"
Pack="true"
PackagePath="targets"
PackagePath="Sdk"
Visible="false"
/>
<FileWrites Include="$(IntermediateOutputPath)BundledVersions.targets" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,6 @@
<ItemGroup Condition=" '$(UseMaui)' == 'true' or '$(UseMauiCore)' == 'true' or '$(UseMauiEssentials)' == 'true' ">
<PackageReference Include="Microsoft.Maui.Dependencies" Version="$(MauiVersion)" IsImplicitlyDefined="true" />
</ItemGroup>
<ItemGroup Condition=" '$(UseMaui)' == 'true' ">
<PackageReference Include="Microsoft.Maui.Controls.Build.Tasks" Version="$(MauiVersion)" IsImplicitlyDefined="true" />
</ItemGroup>
<ItemGroup Condition=" '$(UseMaui)' == 'true' or '$(UseMauiAssets)' == 'true' ">
<PackageReference Include="Microsoft.Maui.Resizetizer.Sdk" Version="$(MauiVersion)" IsImplicitlyDefined="true" />
</ItemGroup>
<ItemGroup Condition=" '$(UseMaui)' == 'true' and '$(UsingMicrosoftNETSdkRazor)' == 'true' ">
<PackageReference Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="$(MauiVersion)" IsImplicitlyDefined="true" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<EnableDefaultCssItems Condition=" '$(EnableDefaultCssItems)' == '' ">$(EnableDefaultMauiItems)</EnableDefaultCssItems>
<EnableDefaultEmbeddedResourceItems Condition=" '$(EnableDefaultEmbeddedResourceItems)' == '' ">$(EnableDefaultMauiItems)</EnableDefaultEmbeddedResourceItems>
</PropertyGroup>
<Import Project="Microsoft.Maui.Controls.targets" />
<Import Project="WinUI.targets" Condition=" '$(TargetPlatformIdentifier)' == 'windows' " />
<!-- @(ProjectCapability) used to identify parts of Maui -->
<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@
<UsingMicrosoftMauiControlsSdk>true</UsingMicrosoftMauiControlsSdk>
</PropertyGroup>

<!--
We aren't supposed to set properties in AutoImport.props
Importing Microsoft.Maui.Controls.props here instead.
-->
<Import Project="Microsoft.Maui.Controls.props" />

<!-- Imported last -->
<PropertyGroup>
<AfterMicrosoftNETSdkTargets>$(AfterMicrosoftNETSdkTargets);$(MSBuildThisFileDirectory)Microsoft.Maui.Sdk.After.targets</AfterMicrosoftNETSdkTargets>
Expand Down
2 changes: 1 addition & 1 deletion src/Workload/Microsoft.Maui.Sdk/Sdk/Sdk.targets
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
/>
</ItemGroup>

<Import Project="../targets/BundledVersions.targets" />
<Import Project="BundledVersions.targets" />
<Import Project="Microsoft.Maui.Sdk.targets" Condition=" '$(UseMaui)' == 'true' " />

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@
</ItemGroup>

<ItemGroup>
<!-- NOTE: Microsoft.Maui.Resizetizer.Sdk.csproj temporarily replaced by Resizetizer.csproj -->
<ProjectReference Include="../Microsoft.Maui.*/*.csproj" Exclude="../Microsoft.Maui.Resizetizer.Sdk/*" />
<ProjectReference Include="../Microsoft.Maui.*/*.csproj" />
<ProjectReference Include="$(MauiRootDirectory)src/SingleProject/Resizetizer/src/Resizetizer.csproj" />
</ItemGroup>

Expand Down
7 changes: 1 addition & 6 deletions src/Workload/Microsoft.NET.Sdk.Maui/WorkloadManifest.in.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
"description": ".NET MAUI SDK Core Packages",
"packs": [
"Microsoft.Maui.Dependencies",
"Microsoft.Maui.Controls.Build.Tasks",
"Microsoft.Maui.Sdk",
"Microsoft.Maui.Extensions",
"Microsoft.Maui.Resizetizer.Sdk",
Expand Down Expand Up @@ -243,12 +242,8 @@
"kind": "sdk",
"version": "@VERSION@"
},
"Microsoft.Maui.Controls.Build.Tasks": {
"kind": "library",
"version": "@VERSION@"
},
"Microsoft.Maui.Resizetizer.Sdk": {
"kind": "library",
"kind": "sdk",
"version": "@VERSION@"
},
"Microsoft.Maui.Templates": {
Expand Down
4 changes: 4 additions & 0 deletions src/Workload/Microsoft.NET.Sdk.Maui/WorkloadManifest.targets
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,8 @@
Condition=" '$(UseMaui)' == 'true' or '$(UseMauiCore)' == 'true' or '$(UseMauiEssentials)' == 'true' or '$(UseMauiAssets)' == 'true' "
Project="Sdk.targets" Sdk="Microsoft.Maui.Sdk"
/>
<Import
Condition=" '$(UseMaui)' == 'true' or '$(UseMauiAssets)' == 'true' "
Project="Sdk.targets" Sdk="Microsoft.Maui.Resizetizer.Sdk"
/>
</Project>
23 changes: 10 additions & 13 deletions src/Workload/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,22 +118,19 @@ To give greater flexibility, you can specify in your `.csproj`:
```

Even if you have `6.0.100-rc.2.1000` installed system-wide, placing
this in your `.csproj` enables it to build with a newer version of
.NET MAUI. This will mostly continue working until there is a major
change in `Microsoft.Maui.Sdk`. We have a new
`$(_MinimumMauiWorkloadVersion)` property to fall back on if there is
a breaking change that requires a newer .NET MAUI system-wide install.
this in your `.csproj` enables it to build against newer MAUI
assemblies at build & runtime. Things might break if the version is
much different that what MAUI source generators or MSBuild tasks
expect. We have a `$(_MinimumMauiWorkloadVersion)` property to fall
back on if there is a breaking change that requires a newer .NET MAUI
system-wide install.

error MAUI004: At least version '6.0.100-preview.7' of the .NET MAUI workload is required to use <MauiVersion>6.0.100-preview.8</MauiVersion>.
error MAUI004: At least version '6.0.200' of the .NET MAUI workload is required to use <MauiVersion>6.0.200-preview.13</MauiVersion>.

To achieve this, we've moved MSBuild tasks to `library-packs`:
One issue is that any MSBuild tasks no longer update via `$(MauiVersion)`:

* `Microsoft.Maui.Controls.Build.Tasks`
* `Microsoft.Maui.Resizetizer.Sdk`

This means these two packs are regular NuGet packages, that are
restores and used during .NET MAUI builds. `dotnet/library-packs` is
simply an implicit NuGet feed.
* `Microsoft.Maui.Sdk`: source generators and XamlC
* `Microsoft.Maui.Resizetizer.Sdk`: MSBuild tasks

## Using the .NET MAUI Workload

Expand Down

0 comments on commit b2596b9

Please sign in to comment.