Description
The runtime repository currently produces 98 packages from libraries and 25 of those contain prebuilts (assets which are not built in the master/main branch anymore). Such prebuilt assets are redistributed into packages via a mechanism called “harvesting”. Without going into detail, the harvesting infrastructure downloads the latest available assets of the “current band” and places them into a specified subfolder inside the package.
In contrast to simplification of the build graph, harvesting has numerous downsides:
- Increased cost of servicing as code fixes need to be applied in the repository’s branch in which the code lives, which is not necessarily the same place where the package is produced and shipped from.
- Dependency between servicing releases, especially during MSRCs which forces schedules to be aligned.
- Source link and newer compiler features (IL size reduction / optimization) are not applicable to harvested assets which causes NuGet Package Explorer to list the whole package as unhealthy.
- Package validation costs
- Fat packages
- Harvesting build validation causes builds to fail in PRs every time new assets are shipped to indicate that harvesting defines should be updated.
- Maintenance of code bases which are not tested anymore.
Based on these disadvantages, we would like to remove harvesting in dotnet/runtime entirely and only ship what is being built live.
Implementation
For the following libraries, build configurations need to be added and/or harvesting configurations in the pkgproj need to be removed.
- Microsoft.Extensions.DependencyModel: Remove harvesting of M.E.DependencyModel #51582
- Microsoft.Win32.Registry: Stop harvesting old frameworks in more libraries #51894
- Microsoft.Win32.Registry.AccessControl: Stop harvesting old frameworks in some libraries #51689
- System.ComponentModel.Annotations: Dead end System.ComponentModel.Annotations package #51891
- System.Composition.AttributedModel: Remove harvesting of System.Composition* #51617
- System.Composition.Convention: Remove harvesting of System.Composition* #51617
- System.Composition.Hosting: Remove harvesting of System.Composition* #51617
- System.Composition.Runtime: Remove harvesting of System.Composition* #51617
- System.Composition.TypedParts: Remove harvesting of System.Composition* #51617
- System.Drawing.Common: Drawing: Replace harvested assets with live config #51934
- System.IO.FileSystem.AccessControl: Stop harvesting old frameworks in some libraries #51689
- System.IO.Pipelines: Stop harvesting old frameworks in some libraries #51689
- System.IO.Pipes.AccessControl: Stop harvesting S.IO.Pipes.AccessControl #52294
- System.Net.Http.WinHttpHandler: Stop harvesting old frameworks in some libraries #51689
- System.Reflection.Context: Stop harvesting old frameworks in some libraries #51689
- System.Security.AccessControl: Stop harvesting old frameworks in more libraries #51894
- System.Security.Cryptography.Cng: Dead end S.Security.Cryptography.Cng package #51853
- System.Security.Cryptography.OpenSsl: Dead end S.Security.Cryptography.OpenSsl package #51854
- System.Security.Cryptography.Pkcs: Stop harvesting S.Security.Cryptography.Pkcs #52045
- System.Security.Cryptography.ProtectedData: Stop harvesting S.Security.Crypto.ProtectedData #51872
- System.Security.Principal.Windows: Stop harvesting old frameworks in more libraries #51894
- System.ServiceProcess.ServiceController: Stop harvesting old frameworks in some libraries #51689
- System.Text.Encoding.CodePages: Stop harvesting old frameworks in more libraries #51894
- System.Text.Encodings.Web: Stop harvesting old frameworks in some libraries #51689
- System.Threading.AccessControl: Stop harvesting old frameworks in some libraries #51689
Add a build warning wherever functionality would regress.
cc @danmosemsft @ericstj @terrajobst @tommcdon