diff --git a/examples/basic/flake.nix b/examples/basic/flake.nix index 78878d5..e58280e 100644 --- a/examples/basic/flake.nix +++ b/examples/basic/flake.nix @@ -12,7 +12,7 @@ pkgs = nixpkgs.legacyPackages.${system}; in { devShells.${system}.default = pkgs.mkShell { - buildInputs = [ + packages = [ (nix-dotnet.lib.${system}.mkDotnet { globalJsonPath = ./global.json; workloads = []; diff --git a/examples/multi-sdk/flake.nix b/examples/multi-sdk/flake.nix index 08afcf1..a0c904c 100644 --- a/examples/multi-sdk/flake.nix +++ b/examples/multi-sdk/flake.nix @@ -12,7 +12,7 @@ pkgs = nixpkgs.legacyPackages.${system}; in { devShells.${system}.default = pkgs.mkShell { - buildInputs = [ + packages = [ (nix-dotnet.lib.${system}.mkDotnet { sdkVersion = "10.0.103"; outputHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; diff --git a/examples/with-workloads/flake.nix b/examples/with-workloads/flake.nix index 1a9e53c..8b98641 100644 --- a/examples/with-workloads/flake.nix +++ b/examples/with-workloads/flake.nix @@ -12,7 +12,7 @@ pkgs = nixpkgs.legacyPackages.${system}; in { devShells.${system}.default = pkgs.mkShell { - buildInputs = [ + packages = [ (nix-dotnet.lib.${system}.mkDotnet { globalJsonPath = ./global.json; workloads = ["android" "maui"]; diff --git a/flake.nix b/flake.nix index 125b6e4..b5dd3f5 100644 --- a/flake.nix +++ b/flake.nix @@ -19,22 +19,22 @@ pkgs = nixpkgs.legacyPackages.${system}; dotnet = import ./src/nix-dotnet.nix {inherit pkgs;}; sdkOutputHashes = { - aarch64-darwin = "sha256-QrDQHIjGxhQu0dqbXFw5idaQ74G6qml0xoNPX+rbEPs="; + aarch64-darwin = "sha256-YxvVtFxTcXR982ar15JUpKhv05WQ4AE4+xH1wxk3yz4="; aarch64-linux = "sha256-t4lHygbZMs2Mdry+rqSgSxhXWubWrC3uj1iIogyBE/U="; - x86_64-darwin = "sha256-bWnl7oDH6ywF2iwFlQ+b1NZ6f5JvRtauaqIQIlz4Mzg="; - x86_64-linux = "sha256-zavpTqfPO/x1YFvGww+QBzyK70eGi50TaA5wkaGziFg="; + x86_64-darwin = "sha256-LX1c87zNmSv/ylVsOWoe9cySVotLeoQ2m05mW6ooT8E="; + x86_64-linux = "sha256-kp0avinB5M1ZpWbdBBArpdsMVdRXqDX3FPF2lSBnWt0="; }; workloadOutputHashes = { - aarch64-darwin = "sha256-PXo7/caO02xsbx2qWcUIXtyvvr2ePifPdvMVzO9+JUE="; + aarch64-darwin = "sha256-PPi+v18l/RAY9AtC92wPJapHfXHHUNYFcjHjmB3GkZM="; aarch64-linux = "sha256-IOo5a1RSjnouRl79Xru01XYdqtiNXS+pgrCa1Fx4+sI="; - x86_64-darwin = "sha256-gJPf567EoBmF22ANZX9qFEA/wtZHU/+GBd6rbaj9VUQ="; - x86_64-linux = "sha256-R6+gCgcfrTv1NYQyI0/3YXmjDRvvooPEOjCR59WSpfk="; + x86_64-darwin = "sha256-7KqU4jd0twDkplMjtaBSVFv/iYwYG1rDoflyKyZwaFE="; + x86_64-linux = "sha256-fvgGMjgceFxb4SpkAZVbxlFD3xBGoc8eehSXdn9OLgA="; }; multiSdkOutputHashes = { - aarch64-darwin = "sha256-McAAMwZCOfvdOKOCjNRKYmpWbdtUQfz03WdoAJImv5c="; + aarch64-darwin = "sha256-+hbEyapmxU8+JLahaIhv47vyNgyvP51QZJsSIEWx9lg="; aarch64-linux = "sha256-olZbB/1rbLs587K9NQXBQ9o2pQH0WSTUjaBORlJVD+4="; - x86_64-darwin = "sha256-5DNjlU1VCJs3Soqemq4gU3YdEFXvIol30qad0udUiuU="; - x86_64-linux = "sha256-3LAIxMUQYqrnEaOAoYA/seSFZuE1pyVL97TjC891VCs="; + x86_64-darwin = "sha256-mHNWI7TtbIKXZSlcrxQFSjmU9f+3Em4u2lqIKSmBiso="; + x86_64-linux = "sha256-qIqid6wnv4OBC5BuvvZL1FvFXKge7k1PzrdqXpIk5fc="; }; outputHashFor = hashes: if builtins.hasAttr system hashes diff --git a/src/nix-dotnet.nix b/src/nix-dotnet.nix index c87fe1e..2622ef3 100644 --- a/src/nix-dotnet.nix +++ b/src/nix-dotnet.nix @@ -53,7 +53,7 @@ for entry in "$out/.runtime"/*; do name="$(basename "$entry")" - if [ "$name" != "dotnet" ]; then + if [ "$name" != "bin" ] && [ "$name" != "dotnet" ]; then ln -s ".runtime/$name" "$out/$name" fi done @@ -62,11 +62,19 @@ '#!${pkgs.bash}/bin/bash' \ 'export LD_LIBRARY_PATH="${dotnetLibraryPath}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"' \ 'script_dir="$(cd "$(dirname "$0")" && pwd)"' \ - 'export DOTNET_ROOT="$script_dir/.runtime"' \ + 'export DOTNET_ROOT="$script_dir"' \ 'exec "$script_dir/.runtime/dotnet" "$@"' \ > "$out/dotnet" chmod +x "$out/dotnet" + mkdir -p "$out/bin" + printf '%s\n' \ + '#!${pkgs.bash}/bin/bash' \ + 'sdk_root="$(cd "$(dirname "$0")/.." && pwd)"' \ + 'exec "$sdk_root/dotnet" "$@"' \ + > "$out/bin/dotnet" + chmod +x "$out/bin/dotnet" + chmod -R a-w "$out" runHook postInstall @@ -214,6 +222,15 @@ rm -f global.json ''} + mkdir -p "$out/bin" "$out/nix-support" + + ln -s ../dotnet "$out/bin/dotnet" + + cat > "$out/nix-support/setup-hook" <<'EOF' + dotnetSdkRoot="$(cd "$(dirname "''${BASH_SOURCE[0]}")/.." && pwd)" + export DOTNET_ROOT="$dotnetSdkRoot" + EOF + echo "Installation complete" echo "SDK Version: $($out/dotnet --version)" @@ -247,6 +264,7 @@ homepage = "https://dotnet.microsoft.com/"; license = licenses.mit; maintainers = []; + mainProgram = "dotnet"; platforms = platforms.all; }; }; diff --git a/tests/integration-multi-sdk-test.nix b/tests/integration-multi-sdk-test.nix index b16b8d8..ed90c72 100644 --- a/tests/integration-multi-sdk-test.nix +++ b/tests/integration-multi-sdk-test.nix @@ -22,15 +22,12 @@ in nativeBuildInputs = [ pkgs.cacert pkgs.gnugrep + dotnetSdk ]; - DOTNET_ROOT = "${dotnetSdk}"; - buildPhase = '' runHook preBuild - export PATH="${dotnetSdk}:$PATH" - export DOTNET_CLI_HOME="$PWD/.dotnet-cli-home" export NUGET_PACKAGES="$PWD/.nuget/packages" export NUGET_HTTP_CACHE_PATH="$PWD/.nuget/http-cache" diff --git a/tests/integration-test.nix b/tests/integration-test.nix index b6d5628..035693d 100644 --- a/tests/integration-test.nix +++ b/tests/integration-test.nix @@ -15,17 +15,14 @@ in src = ./integration; - nativeBuildInputs = [pkgs.cacert]; - - # Configure .NET CLI environment (absolute paths required) - DOTNET_ROOT = "${dotnetSdk}"; + nativeBuildInputs = [ + pkgs.cacert + dotnetSdk + ]; buildPhase = '' runHook preBuild - # Add dotnet to PATH - export PATH="${dotnetSdk}:$PATH" - # Use absolute paths for .NET CLI environment export DOTNET_CLI_HOME="$PWD/.dotnet-cli-home" export NUGET_PACKAGES="$PWD/.nuget/packages" @@ -35,9 +32,21 @@ in mkdir -p "$DOTNET_CLI_HOME" "$NUGET_PACKAGES" "$NUGET_HTTP_CACHE_PATH" "$HOME" echo "=== Integration Test: Building .NET Project ===" + echo "dotnet on PATH: $(command -v dotnet)" + echo "DOTNET_ROOT: $DOTNET_ROOT" echo "SDK Version: $(dotnet --version)" echo "" + if [ "$(command -v dotnet)" != "${dotnetSdk}/bin/dotnet" ]; then + echo "ERROR: dotnet did not resolve to the mkDotnet package" + exit 1 + fi + + if [ "$DOTNET_ROOT" != "${dotnetSdk}" ]; then + echo "ERROR: DOTNET_ROOT was not exported by the setup hook" + exit 1 + fi + # Restore NuGet packages echo "Step 1: Restoring NuGet packages..." dotnet restore TestSolution.slnx --locked-mode diff --git a/tests/integration-workload-test.nix b/tests/integration-workload-test.nix index db56ba5..93021a0 100644 --- a/tests/integration-workload-test.nix +++ b/tests/integration-workload-test.nix @@ -18,15 +18,12 @@ in nativeBuildInputs = [ pkgs.cacert pkgs.gnugrep + dotnetSdk ]; - DOTNET_ROOT = "${dotnetSdk}"; - buildPhase = '' runHook preBuild - export PATH="${dotnetSdk}:$PATH" - export DOTNET_CLI_HOME="$PWD/.dotnet-cli-home" export NUGET_PACKAGES="$PWD/.nuget/packages" export NUGET_HTTP_CACHE_PATH="$PWD/.nuget/http-cache" diff --git a/tests/integration/flake.nix b/tests/integration/flake.nix index bd658d8..14c2f4f 100644 --- a/tests/integration/flake.nix +++ b/tests/integration/flake.nix @@ -15,9 +15,9 @@ dotnet = import ../../src/nix-dotnet.nix {inherit pkgs;}; sdkOutputHash = if system == "aarch64-darwin" - then "sha256-QrDQHIjGxhQu0dqbXFw5idaQ74G6qml0xoNPX+rbEPs=" + then "sha256-YxvVtFxTcXR982ar15JUpKhv05WQ4AE4+xH1wxk3yz4=" else if system == "x86_64-linux" - then "sha256-zavpTqfPO/x1YFvGww+QBzyK70eGi50TaA5wkaGziFg=" + then "sha256-kp0avinB5M1ZpWbdBBArpdsMVdRXqDX3FPF2lSBnWt0=" else throw "No outputHash configured for system ${system}"; dotnetSdk = dotnet.mkDotnet { @@ -32,17 +32,14 @@ src = ./.; - nativeBuildInputs = [pkgs.cacert]; - - # Configure .NET CLI environment - DOTNET_ROOT = "${dotnetSdk}"; + nativeBuildInputs = [ + pkgs.cacert + dotnetSdk + ]; buildPhase = '' runHook preBuild - # Add dotnet to PATH - export PATH="${dotnetSdk}:$PATH" - # Use absolute paths for .NET CLI environment export DOTNET_CLI_HOME="$PWD/.dotnet-cli-home" export NUGET_PACKAGES="$PWD/.nuget/packages" diff --git a/tests/unit.nix b/tests/unit.nix index cb63100..8ff753a 100644 --- a/tests/unit.nix +++ b/tests/unit.nix @@ -315,6 +315,11 @@ in { expected = "dotnet-sdk-android"; }; + testMkDotnetMainProgram = { + expr = (mkDotnetFrom validGlobalJson [] validOutputHash).meta.mainProgram; + expected = "dotnet"; + }; + testMkDotnetPassthruWorkloads = { expr = (mkDotnetFrom validGlobalJson [