DotNET: Difference between revisions
No edit summary |
Bring example more in line with Nixpkgs manual re: NuGet deps; don't suggest copying hash from failed build log Tag: 2017 source edit |
||
Line 18: | Line 18: | ||
repo = pname; | repo = pname; | ||
rev = "v${version}"; | rev = "v${version}"; | ||
hash = ""; # use e.g. `nix-prefetch-git` | |||
}; | }; | ||
Line 24: | Line 24: | ||
dotnet-sdk = dotnetCorePackages.sdk_8_0; | dotnet-sdk = dotnetCorePackages.sdk_8_0; | ||
dotnet-runtime = dotnetCorePackages.runtime_8_0; | dotnet-runtime = dotnetCorePackages.runtime_8_0; | ||
nugetDeps = ./ | nugetDeps = ./deps.nix; # to generate, set to `""`, then `nix-build -A fetch-deps && ./result` | ||
meta = with lib; { | meta = with lib; { | ||
Line 35: | Line 35: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
If the <code>fetch-deps</code> script isn't working for whatever reason, you can manually run <code>nuget-to-nix</code>: | |||
<syntaxhighlight lang="sh"> | |||
< | dotnet restore --packages=packageDir ./SomeProject.csproj | ||
nuget-to-nix packageDir >deps.nix | |||
rm -r packageDir | |||
</syntaxhighlight> | |||
Remember to build and run the <code>fetch-deps</code> script after NuGet packages are updated, or building the derivation will fail. | |||
== Building non-.NET Core packages == | == Building non-.NET Core packages == |
Revision as of 13:43, 24 June 2024
.NET packages can be built with buildDotnetModule
More information about buildDotnetModule
can be found in the nixpkgs manual
Example build file:
{ fetchFromGitHub
, dotnetCorePackages
, buildDotnetModule
}:
buildDotnetModule rec {
pname = "some_program";
version = "some_version";
src = fetchFromGitHub {
owner = "some_owner";
repo = pname;
rev = "v${version}";
hash = ""; # use e.g. `nix-prefetch-git`
};
projectFile = "SomeProject/SomeProject.csproj";
dotnet-sdk = dotnetCorePackages.sdk_8_0;
dotnet-runtime = dotnetCorePackages.runtime_8_0;
nugetDeps = ./deps.nix; # to generate, set to `""`, then `nix-build -A fetch-deps && ./result`
meta = with lib; {
homepage = "some_homepage";
description = "some_description";
license = licenses.mit;
};
}
If the fetch-deps
script isn't working for whatever reason, you can manually run nuget-to-nix
:
dotnet restore --packages=packageDir ./SomeProject.csproj
nuget-to-nix packageDir >deps.nix
rm -r packageDir
Remember to build and run the fetch-deps
script after NuGet packages are updated, or building the derivation will fail.
Building non-.NET Core packages
Keep in mind that building non-.NET Core projects (ie. projects that don't build using the dotnet
CLI tool) is not well supported. For those projects, you have to work on a custom derivation or override the buildDotnetModule
build steps.
Building ASP.NET packages
Currently building ASP.NET packages produces website that does not work correctly out of the box because the executable can not find ContentRoot and wwwroot, so all the static assets won't load.
.NET location: Not found
If running a .NET-build executable you get the above error, make sure the DOTNET_ROOT environment variable is set:
environment.sessionVariables = {
DOTNET_ROOT = "${pkgs.dotnet-sdk}";
};
TargetFramework value was not recognized
error NETSDK1013: The TargetFramework value 'net6.0-windows' was not recognized. It may be misspelled. If not, then the TargetFrameworkIdentifier and/or TargetFrameworkVersion properties must be specified explicitly.
Wontfix: The project will build only on Windows.
NativeAOT
This is relevant for NixOS only.
nix-ld is needed:
{
programs.nix-ld.enable = true;
}
Now we will need a bunch of native dependencies. Here's an example of a shell:
with import <nixpkgs> {};
pkgs.mkShell rec {
dotnetPkg =
(with dotnetCorePackages; combinePackages [
sdk_7_0
]);
deps = [
zlib
zlib.dev
openssl
dotnetPkg
];
NIX_LD_LIBRARY_PATH = lib.makeLibraryPath ([
stdenv.cc.cc
] ++ deps);
NIX_LD = "${pkgs.stdenv.cc.libc_bin}/bin/ld.so";
nativeBuildInputs = [
] ++ deps;
shellHook = ''
DOTNET_ROOT="${dotnetPkg}";
'';
}
Global Tools
Local installation of .NET global tools is fully supported and preferred when possible - more info in the Microsoft docs.
For globally installing .NET tools, search if they are available as Nix packages - they are packaged as any other normal
.NET binary, using buildDotnetModule
. For .NET tools with no source available, or those hard to build from source, buildDotnetGlobalTool
is available. See dotnet nixpkgs manual for more info.
Note that Nix-packaged .NET tools use a special wrapper (toggled by useDotnetFromEnv
option in buildDotnetModule
) that automatically picks up .NET install from the user environment. If you want to use a
different SDK version with a Nix-packaged .NET tools than the default, make sure the dotnet
CLI of your wanted SDK version is installed and available.
Example: Running Rider with dotnet & PowerShell
Rider package
pkgs.jetbrains.rider
dotnet.nix
with import <nixpkgs> {};
mkShell {
name = "dotnet-env";
packages = [
(with dotnetCorePackages; combinePackages [
sdk_6_0
sdk_7_0
sdk_8_0
])
powershell
];
}
To execute Rider
nix-shell ./dotnet.nix --run 'nohup rider &'
This can be added as an alias to your shell if you update the reference to an absolute address, such as location within your home directory. e.g. `~/nix/dotnet.nix`
Example: multi-SDK installation with local workload installation enabled
By default, workload installation will fail on NixOS, as dotnet will attempt to save it to $DOTNET_ROOT, which is inside the read-only Nix store.
Please visit the forum for an example of a multi-SDK installation with workload changed to install to home directory.
See also
- NixOS GitHub dotnet docs
- dotnet in the nixpkgs manual
- buildDotnetModule references in nixpkgs
- The journey of packaging a .NET app on Nix
- https://en.wikipedia.org/wiki/.NET_Framework - The old, windows-only version of .NET. Newer versions (ie. .NET Core) are multiplatform.
- https://en.wikipedia.org/wiki/Mono_(software) is the deprecated open source implementation of the DotNET compiler and runtime. It has transformed into .NET Core.
- https://learn.microsoft.com/en-us/dotnet/core/introduction