{ lib, stdenv , fetchFromGitHub , fetchurl , dotnetCorePackages , makeWrapper , unzip , writeText }: let dotnet-sdk = dotnetCorePackages.sdk_6_0; deps = map (package: stdenv.mkDerivation (with package; { inherit pname version src; buildInputs = [ unzip ]; unpackPhase = '' unzip $src chmod -R u+r . function traverseRename () { for e in * do t="$(echo "$e" | sed -e "s/%20/\ /g" -e "s/%2B/+/g")" [ "$t" != "$e" ] && mv -vn "$e" "$t" if [ -d "$t" ] then cd "$t" traverseRename cd .. fi done } traverseRename ''; installPhase = '' runHook preInstall package=$out/lib/dotnet/${pname}/${version} mkdir -p $package cp -r . $package echo "{}" > $package/.nupkg.metadata runHook postInstall ''; dontFixup = true; })) (import ./deps.nix { inherit fetchurl; }); nuget-config = writeText "NuGet.Config" '' ${lib.concatStringsSep "\n" (map (package: "") deps)} ''; in stdenv.mkDerivation rec { pname = "omnisharp-roslyn"; version = "1.38.2"; src = fetchFromGitHub { owner = "OmniSharp"; repo = pname; rev = "v${version}"; sha256 = "7XJIdotfffu8xo+S6xlc1zcK3oY9QIg1CJhCNJh5co0="; }; nativeBuildInputs = [ makeWrapper dotnet-sdk ]; postPatch = '' # Relax the version requirement substituteInPlace global.json \ --replace '6.0.100' '${dotnet-sdk.version}' ''; buildPhase = '' runHook preBuild HOME=$(pwd)/fake-home dotnet msbuild -r \ -p:Configuration=Release \ -p:RestoreConfigFile=${nuget-config} \ src/OmniSharp.Stdio.Driver/OmniSharp.Stdio.Driver.csproj runHook postBuild ''; installPhase = '' mkdir -p $out/bin cp -r bin/Release/OmniSharp.Stdio.Driver/net6.0 $out/src makeWrapper $out/src/OmniSharp $out/bin/omnisharp \ --prefix DOTNET_ROOT : ${dotnet-sdk} \ --suffix PATH : ${dotnet-sdk}/bin ''; meta = with lib; { description = "OmniSharp based on roslyn workspaces"; homepage = "https://github.com/OmniSharp/omnisharp-roslyn"; platforms = platforms.unix; license = licenses.mit; maintainers = with maintainers; [ tesq0 ericdallo corngood ]; }; }