edolstra / flake-compat

MIT License
254 stars 71 forks source link

Cannot nixpkgs.callPackage the default.nix #32

Open Quoteme opened 2 years ago

Quoteme commented 2 years ago

I put

(import
  (
    let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
    fetchTarball {
      url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
      sha256 = lock.nodes.flake-compat.locked.narHash;
    }
  )
  { src = ./.; }
).defaultNix

in my default.nix and also

inputs.flake-compat = {
  url = github:edolstra/flake-compat;
  flake = false;
};

in my flake.nix. But when I try putting this in my configuration.nix

neovim-luca = (pkgs.callPackage (pkgs.fetchFromGitHub {
    owner = "quoteme";
    repo = "neovim-luca";
    rev = "d85f02952e35d0fd2afa783adb3e93d08fdd03d9";
    sha256 = "sha256-sPX1RaR3H4Hs2YEetdjI7b4UxBC4UxIkvOl1LIYSZuM=";
  }) {});

and doing sudo nixos-rebuild switch I get the following error:

building Nix...
building the system configuration...
error: attempt to call something which is not a function but a set

       at /nix/store/34br6qh4x4hjj15jjnbiivwgdhz4ci5a-nixos/nixos/lib/customisation.nix:69:16:

           68|     let
           69|       result = f origArgs;
             |                ^
           70|
(use '--show-trace' to show detailed location information)

nix-build works fine. But callPackage does not work. How can I fix this?

Radvendii commented 2 years ago

The default.nix at the root of a project is not supposed to be called with with callPackage. This is a little bit confusing (at least it was for me), but let me try to explain:

There are two types of default.nix files that are commonly used. The ones (typically at the root of a project) that get fed into nix-build, and the ones (typically in nixpkgs) that get fed into callPackage.

nix-build expects a file with just a derivation in it. callPackage expects a function from things in nixpkgs to a derivation.

In other words, you should be able to just remove pkgs.callPackage, since your default.nix is just a derivation, it's not a function that needs to be applied to anything.

dpc commented 2 years ago

@Radvendii Hi. I'm glad I've found your comment. I had the same issues as OP. However when I apply your suggestion I get another error:

> nix develop
error: builder for '/nix/store/r8rbia8zx7v66vwfsykd0s0k6iraa9jz-nix-shell-env.drv' failed with exit code 2;
       last 1 log lines:
       > /nix/store/1fl42m4278x5d0wywih5dcd1zbfs8aib-default.nix: line 4: syntax error near unexpected token `('
       For full logs, run 'nix log /nix/store/r8rbia8zx7v66vwfsykd0s0k6iraa9jz-nix-shell-env.drv'.

https://github.com/rustshop/rustshop/blob/6a31b6fba00d94da117af893b49524ab42c74f29/infra/flake.nix#L18

I had to remove {} as well. Is there anything else that is obvious that I'm missing? (I'm still a Nix noob)

dpc commented 2 years ago

After playing with repl I'm even more confused: https://discourse.nixos.org/t/different-result-on-import-path-default-nix-in-flake-nix-vs-repl/19997 - I'm able to get the derivation in nix repl (with (import ./path/default.nix).default but not in my flake.nix.

dpc commented 2 years ago

I think it is breaking because builtins.currentsystem

Edit: I was right! Here is the workaround that worked for me: https://github.com/rustshop/rustshop/commit/26824e3eb119b8cb5cdfcedddf291853344673a1

abathur commented 2 years ago

In case it helps someone else, I ran into both of the error messages in this thread trying to figure out how to use the default flake output in a normal ci.nix that I need to nix-build. I might still be holding it wrong, but I ended up getting it working by just using:

lilgit = (builtins.getFlake (toString ./.)).packages.${builtins.currentSystem}.default;
JZL commented 6 months ago

Thanks so much for helping with this

(import /path/.../default.nix).default

worked perfectly!

I'm new to nix so I don't know what's obvious to others, but adding that .default took me hours to figure out.

I had gotten it to work via nix-build default.nix easily and then tried to add it to my systemPackages in configuration.nix but got a series of very cryptic errors.

Do you think it'd be worth adding this secondary usage syntax to the readme more prominently