stack build error: attribute ‘ghc822’ missing, at (string):1:53

后端 未结 5 1191
后悔当初
后悔当初 2021-02-14 11:53

I am attempting to build my haskell project on NixOS.

Running $ stack build gives the following error.

$ stack build
error: attribute ‘ghc82         


        
相关标签:
5条回答
  • 2021-02-14 12:04

    As palik commented, changing the resolver version -- in my case changing

    resolver: lts-11.3

    to

    resolver: lts-9.1

    in stack.yaml is a work-around. I do not know what the deeper issue is but would be interested to know.

    0 讨论(0)
  • 2021-02-14 12:12

    You can provide an old GHC version using a shell.nix file place in the root of your project:

    with import (fetchTarball https://github.com/NixOS/nixpkgs/archive/83b35508c6491103cd16a796758e07417a28698b.tar.gz) {};
    let ghc = haskell.compiler.ghc802;
    in haskell.lib.buildStackProject {
        inherit ghc;
        name = "myEnv";
        buildInputs = [ pcre ];
    }
    

    Use a tar url from https://github.com/NixOS/nixpkgs/releases for a version of nixpkgs that contains the GHC version you need.

    Then run nix-shell in the root of the project. This will put you into a shell in which you can perform stack build successfully since it would have access to the correct GHC version.

    0 讨论(0)
  • 2021-02-14 12:14

    Another option is to use a shell.nix. nixos-18.03 comes with ghc 8.2.2, so you can create a shell.nix like:

    with import (builtins.fetchGit {
        url = https://github.com/NixOS/nixpkgs-channels;
        ref = "nixos-18.03";
        rev = "cb0e20d6db96fe09a501076c7a2c265359982814";
    }) {};
    
    haskell.lib.buildStackProject {
        name = "my-project";
        buildInputs = [ ghc <otherlibs-here> ];
    }
    

    And add the following to your stack.yaml:

    nix:
      shell-file: shell.nix
    

    Then stack build as usual.

    0 讨论(0)
  • 2021-02-14 12:23

    based on @steve-chávez answer

    stack.yaml

    resolver: lts-13.19
    system-ghc: true
    install-ghc: false
    
    nix:
      enable: true
      path: [nixpkgs=./nix/nixpkgs/default.nix]
      shell-file: shell.nix
    

    nix/nixpkgs/default.nix

    let
      spec = builtins.fromJSON (builtins.readFile ./revision.json);
    
      src = import <nix/fetchurl.nix> {
        url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.rev}.tar.gz";
        inherit (spec) sha256;
      };
      nixcfg = import <nix/config.nix>;
    
      nixpkgs = builtins.derivation {
        system = builtins.currentSystem;
        name = "${src.name}-unpacked";
        builder = builtins.storePath nixcfg.shell;
        inherit src;
        args = [
          (builtins.toFile "builder" ''
            $coreutils/mkdir $out
            cd $out
            $gzip -d < $src | $tar -x --strip-components=1
          '')
        ];
        coreutils = builtins.storePath nixcfg.coreutils;
        tar = builtins.storePath nixcfg.tar;
        gzip = builtins.storePath nixcfg.gzip;
      };
    in
      import nixpkgs
    

    nix/nixpkgs/update.sh

    #!/usr/bin/env nix-shell
    #!nix-shell -i bash -p nix curl jq
    
    SCRIPT_DIR=$(dirname "$(readlink -f "$BASH_SOURCE")")
    
    owner="nixos"
    repo="nixpkgs-channels"
    rev="nixos-unstable"
    
    full_rev=$(curl --silent https://api.github.com/repos/$owner/$repo/git/refs/heads/$rev | jq -r .object.sha)
    
    echo "full_rev=$full_rev"
    
    expected_sha=$(nix-prefetch-url https://github.com/$owner/$repo/archive/$full_rev.tar.gz)
    
    cat >"$SCRIPT_DIR/revision.json" <<EOL
    {
      "owner":  "$owner",
      "repo":   "$repo",
      "rev":    "$full_rev",
      "sha256": "$expected_sha"
    }
    EOL
    

    shell.nix

    {
      #
      # there are 2 ways of using stack with nix
      # - define custom packages in `stack.yaml` `packages` option (https://docs.haskellstack.org/en/stable/nix_integration/#additions-to-your-stackyaml)
      # - define custom package in `shell.nix` AND `shell-file: ...` in `stack.yaml` (https://docs.haskellstack.org/en/stable/nix_integration/#additions-to-your-stackyaml)
      #
      # we are using second option
    
      ghc # stack expect this file to define a function of exactly one argument that should be called ghc
    }:
    
    
    let
      # pkgs = import ./nix/nixpkgs/default.nix {}
      pkgs = import <nixpkgs> {};
    in
    
    with pkgs;
    
    haskell.lib.buildStackProject {
      inherit ghc;
      name = "myEnv";
      buildInputs = [ cabal-install ];
    }
    
    0 讨论(0)
  • 2021-02-14 12:27

    It seems like your stack wants to retrieve the haskell.packages.ghc822 attribute or perhaps haskell.compiler.ghc822, which is not present in your version of <nixpkgs>.

    Please check your channel configuration using sudo nix-channel --list (NixOS) or nix-channel --list. Releases 17.03 and older do not have this attribute. 17.09 and unstable should be fine. To switch your default <nixpkgs> to 17.09, note the name of the channel and run

    nix-channel --add https://nixos.org/channels/nixos-17.09 <NAME>
    

    Also run nix-channel --update to make sure you have a recent version. GHC 8.2.2 was added on Oct 31st.

    If you don't want to change your channel configuration, I suppose you can set the NIX_PATH environment variable

    NIX_PATH=nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz stack build
    
    0 讨论(0)
提交回复
热议问题