This repository is a Virtual Monolithic Repository (VMR) which includes all the source code and infrastructure needed to build the .NET SDK.
What this means:
- Monolithic - a join of multiple repositories that make up the whole product, such as dotnet/runtime or dotnet/sdk.
- Virtual - a mirror (not replacement) of product repos where sources from those repositories are synchronized into.
- Experimental - not to be depended on as we reserve the right to delete the current instance and create a new, different one in its stead. See Limitations.
In the VMR, you can find:
- source files of each product repository which are mirrored inside of their respective directories under
src/
, - tooling that enables building the whole .NET product from source on Linux platforms,
- small customizations, in the form of patches, applied on top of the original code to make the build possible,
- [in future] E2E tests for the whole .NET product.
Just like the development repositories, the VMR will have a release branch for every feature band (e.g. release/8.0.1xx-preview1
).
Similarly, VMR's main
branch will follow main
branches of product repositories (see Synchronization Based on Declared Dependencies).
More in-depth documentation about the VMR can be found in VMR Design And Operation. See also dotnet/source-build for more information about our whole-product source-build.
- The main purpose of the dotnet/dotnet repository is to have all source code necessary to build the .NET product available in one repository and identified by a single commit.
- The VMR also aims to become the place from which we release and service future versions of .NET to reduce the complexity of the product construction process. This should allow our partners and and 3rd parties to easily build, test and modify .NET using their custom infrastructure as well as make the process available to the community.
- Lastly, we hope to solve other problems that the current multi-repo setup brings:
- Enable the standard down-/up-stream open-source model.
- Fulfill requirements of .NET distro builders such as RedHat or Canonical to natively include .NET in their distribution repositories.
- Simplify scenarios such as client-run testing of bug fixes and improvements. The build should work in an offline environment too for certain platforms.
- Enable developers to make and test changes spanning multiple repositories.
- More efficient pipeline for security fixes during the CVE pre-disclosure process.
This is a work-in-progress and an experiment. There are considerable limitations to what is possible at the moment. For an extensive list of current limitations, please see Temporary Mechanics.
The VMR is expected to become non-experimental by .NET 8 Preview 1 (Februrary, 2023). This means it won't be short-lived anymore and we won't be reserving the right to delete and re-create it anymore. Other limitations might apply until the .NET 9 timeframe. See the Unified Build roadmap for more details.
The VMR only supports .NET 8.0 and higher. Additionally, source-build currently supports Linux only.
It is expected that Mac and Windows will be supported in the .NET 9.0.
For the latest information about Source-Build support for new .NET versions, please check our GitHub Discussions page for announcements.
Building the product offline is not fully working at the moment. The --online
switch is needed when building the VMR as not all dependencies are currently built from source.
For the time being, the source code only flows one way - from the development repos into the VMR. More details on this process:
- Source Synchronization Process
- Synchronization Based on Declared Dependencies
- Moving Code and Dependencies between the VMR and Development Repos
We expect the code flow to start working both ways in the .NET 9 timeframe. See the Unified Build roadmap for more details.
At this time, the VMR will not accept any changes and is a read-only mirror of the development repositories only. Please, make the changes in the respective development repositories (e.g., dotnet/runtime or dotnet/sdk) and they will get synchronized into the VMR automatically.
Please note that this repository is an experiment and a work-in-progress so it is possible that the build is broken. For the latest information about Source-Build support, please watch for announcements posted on our GitHub Discussions page.
The dependencies for building .NET from source can be found here. In case you don't want to / cannot prepare your environment per the requirements, consider using Docker.
-
Clone the VMR
git clone https://github.com/dotnet/dotnet dotnet-dotnet
-
Prep the source to build on your distro
This downloads a .NET SDK and a number of .NET packages needed to build .NET from source.cd dotnet-dotnet ./prep.sh
-
Build the .NET SDK
./build.sh --clean-while-building --online
This builds the entire .NET SDK from source. The resulting SDK is placed at
artifacts/x64/Release/dotnet-sdk-8.0.100-your-RID.tar.gz
.Currently, the
--online
flag is required to allow NuGet restore from online sources during the build. This is useful for testing unsupported releases that don't yet build without downloading pre-built binaries from the internet.Run
./build.sh --help
to see more information about supported build options. -
(Optional) Unpack and install the .NET SDK
mkdir -p $HOME/dotnet tar zxf artifacts/[your-arch]/Release/dotnet-sdk-8.0.100-[your-RID].tar.gz -C $HOME/dotnet ln -s $HOME/dotnet/dotnet /usr/bin/dotnet
To test your source-built SDK, run the following:
dotnet --info
You can also build the repository using a Docker image which has the required prerequisites inside.
The example below creates a Docker volume named vmr
and clones and builds the VMR there.
docker run --rm -it -v vmr:/vmr -w /vmr mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8
git clone https://github.com/dotnet/dotnet .
./prep.sh && ./build.sh --online
mkdir -p $HOME/.dotnet
tar -zxf artifacts/x64/Release/dotnet-sdk-8.0.100-centos.8-x64.tar.gz -C $HOME/.dotnet
ln -s $HOME/.dotnet/dotnet /usr/bin/dotnet
You can also utilize GitHub Codespaces where you can find preset containers in this repository.
In case you'd like to export a more lightweight archive of sources that can be built outside of this git repository, a simple copy of the working tree won't do.
The build is using some git metadata (information from the .git
directory) that are needed to be kept with the sources.
To export a tar.gz
archive of the sources, you need to use the eng/pack-sources.sh
script from within a clone of the VMR checked out at the revision that you're interested in.
To enable full offline source-building of the VMR, we have no other choice than to synchronize all the necessary code into the VMR. This also includes any code referenced via git submodules. More details on why and how this is done can be found here:
src/arcade
dotnet/arcade@c453dfesrc/aspnetcore
dotnet/aspnetcore@cec7fbfsrc/aspnetcore/src/submodules/googletest
google/googletest@2f2e72bsrc/aspnetcore/src/submodules/MessagePack-CSharp
aspnet/MessagePack-CSharp@fe9fa08src/aspnetcore/src/submodules/spa-templates
dotnet/spa-templates@81de03e
src/cecil
dotnet/cecil@8f5aa25src/command-line-api
dotnet/command-line-api@8374d5fsrc/deployment-tools
dotnet/deployment-tools@c3ad00asrc/diagnostics
dotnet/diagnostics@e3e1490src/emsdk
dotnet/emsdk@3ae16c4src/format
dotnet/format@2cb3e68src/fsharp
dotnet/fsharp@6e28044src/installer
dotnet/installer@c84d89csrc/linker
dotnet/linker@c790896src/linker/external/cecil
dotnet/cecil@2941911
src/msbuild
dotnet/msbuild@fc3ab4csrc/nuget-client
nuget/nuget.client@419ab86src/nuget-client/submodules/NuGet.Build.Localization
NuGet/NuGet.Build.Localization@f15db7b
src/razor
dotnet/razor@512e5f8src/roslyn
dotnet/roslyn@8da03f9src/roslyn-analyzers
dotnet/roslyn-analyzers@1dc431esrc/runtime
dotnet/runtime@e71a4fbsrc/sdk
dotnet/sdk@516144csrc/source-build-externals
dotnet/source-build-externals@46f5e8esrc/source-build-externals/src/application-insights
Microsoft/ApplicationInsights-dotnet@51c3ed8src/source-build-externals/src/azure-activedirectory-identitymodel-extensions-for-dotnet
AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet@a9de8ffsrc/source-build-externals/src/cssparser
dotnet/cssparser@d6d86bcsrc/source-build-externals/src/humanizer
Humanizr/Humanizer@3ebc38dsrc/source-build-externals/src/MSBuildLocator
microsoft/MSBuildLocator@5484ae4src/source-build-externals/src/newtonsoft-json
JamesNK/Newtonsoft.Json@ae9fe44
src/source-build-reference-packages
dotnet/source-build-reference-packages@d842772src/sourcelink
dotnet/sourcelink@4ad5e57src/symreader
dotnet/symreader@7b9791dsrc/templating
dotnet/templating@13ce2d4src/test-templates
dotnet/test-templates@bb36956src/vstest
microsoft/vstest@ef449easrc/xdt
dotnet/xdt@9a1c3e1src/xliff-tasks
dotnet/xliff-tasks@ff7db52
The repository also contains a JSON manifest listing all components in a machine-readable format.
This repo does not accept issues as of now. Please file issues to the appropriate development repos. For issues with the VMR itself, please use the source-build repository.
- Design documentation for the VMR - a set of documents describing the high-level design and the why's and how's
- .NET Source-Build
- What is .NET
.NET Runtime is a .NET Foundation project.
.NET is licensed under the MIT license.