diff --git a/doc/languages-frameworks/dotnet.section.md b/doc/languages-frameworks/dotnet.section.md index 408446674e90..4c245a7544e1 100644 --- a/doc/languages-frameworks/dotnet.section.md +++ b/doc/languages-frameworks/dotnet.section.md @@ -87,6 +87,7 @@ To package Dotnet applications, you can use `buildDotnetModule`. This has simila * `executables` is used to specify which executables get wrapped to `$out/bin`, relative to `$out/lib/$pname`. If this is unset, all executables generated will get installed. If you do not want to install any, set this to `[]`. This gets done in the `preFixup` phase. * `runtimeDeps` is used to wrap libraries into `LD_LIBRARY_PATH`. This is how dotnet usually handles runtime dependencies. * `buildType` is used to change the type of build. Possible values are `Release`, `Debug`, etc. By default, this is set to `Release`. +* `selfContainedBuild` allows to enable the [self-contained](https://docs.microsoft.com/en-us/dotnet/core/deploying/#publish-self-contained) build flag. By default, it is set to false and generated applications have a dependency on the selected dotnet runtime. If enabled, the dotnet runtime is bundled into the executable and the built app has no dependency on Dotnet. * `dotnet-sdk` is useful in cases where you need to change what dotnet SDK is being used. * `dotnet-runtime` is useful in cases where you need to change what dotnet runtime is being used. This can be either a regular dotnet runtime, or an aspnetcore. * `dotnet-test-sdk` is useful in cases where unit tests expect a different dotnet SDK. By default, this is set to the `dotnet-sdk` attribute. diff --git a/pkgs/build-support/dotnet/build-dotnet-module/default.nix b/pkgs/build-support/dotnet/build-dotnet-module/default.nix index 15fe5a2c5d41..339eac16b0b2 100644 --- a/pkgs/build-support/dotnet/build-dotnet-module/default.nix +++ b/pkgs/build-support/dotnet/build-dotnet-module/default.nix @@ -55,6 +55,8 @@ # The type of build to perform. This is passed to `dotnet` with the `--configuration` flag. Possible values are `Release`, `Debug`, etc. , buildType ? "Release" +# If set to true, builds the application as a self-contained - removing the runtime dependency on dotnet +, selfContainedBuild ? false # The dotnet SDK to use. , dotnet-sdk ? dotnetCorePackages.sdk_6_0 # The dotnet runtime to use. diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.sh b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.sh index 5a5ece6d9975..a8a830195eaa 100644 --- a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.sh +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.sh @@ -14,6 +14,12 @@ dotnetBuildHook() { parallelBuildFlag="false" fi + if [ "${selfContainedBuild-}" ]; then + dotnetBuildFlags+=("--self-contained") + else + dotnetBuildFlags+=("--no-self-contained") + fi + if [ "${version-}" ]; then versionFlag="-p:Version=${version-}" fi diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.sh b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.sh index 675006508f6c..0a881fae9cfa 100644 --- a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.sh +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.sh @@ -4,8 +4,12 @@ makeWrapperArgs=( ${makeWrapperArgs-} ) # First argument is the executable you want to wrap, # the second is the destination for the wrapper. wrapDotnetProgram() { + if [ ! "${selfContainedBuild-}" ]; then + dotnetRootFlag=("--set" "DOTNET_ROOT" "@dotnetRuntime@") + fi + makeWrapper "$1" "$2" \ - --set "DOTNET_ROOT" "@dotnetRuntime@" \ + "${dotnetRootFlag[@]}" \ --suffix "LD_LIBRARY_PATH" : "@runtimeDeps@" \ "${gappsWrapperArgs[@]}" \ "${makeWrapperArgs[@]}" diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.sh b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.sh index 7984c5ebd3cc..fd88ea32ec04 100644 --- a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.sh +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.sh @@ -6,6 +6,12 @@ dotnetInstallHook() { runHook preInstall + if [ "${selfContainedBuild-}" ]; then + dotnetInstallFlags+=("--self-contained") + else + dotnetInstallFlags+=("--no-self-contained") + fi + for project in ${projectFile[@]}; do env \ dotnet publish "$project" \ @@ -15,7 +21,6 @@ dotnetInstallHook() { --output "$out/lib/${pname}" \ --configuration "@buildType@" \ --no-build \ - --no-self-contained \ ${dotnetInstallFlags[@]} \ ${dotnetFlags[@]} done