【问题标题】:Equivalent of passing `-p zlib` argument to `nix-shell` in `shell.nix`相当于在 `shell.nix` 中将`-p zlib` 参数传递给`nix-shell`
【发布时间】:2019-10-10 15:54:38
【问题描述】:

如果我在 nix-shell 下构建我的 Haskell 项目,则会出现关于缺少 zlib 的错误。

如果我在 nix-shell 中使用 nix-shell -p zlib 构建项目,那么项目会看到 zlib 并成功构建。

如何将zlib 包添加到shell.nix 文件中,以便不再需要传递-p zlib

注意:构建是使用 cabal v2-build 完成的

为了使用堆栈构建,我必须这样做 the following

这就是我的shell.nix 当前的定义方式:

{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }:

let

  inherit (nixpkgs) pkgs;

  f = { mkDerivation, base, directory, stdenv, text, turtle, zlib }:
      mkDerivation {
        pname = "haskell-editor-setup";
        version = "0.1.0.0";
        src = ./.;
        isLibrary = false;
        isExecutable = true;
        executableHaskellDepends = [ base directory text turtle zlib ];
        description = "Terminal program that will set up Haskell environment with a target selected editor or IDE";
        license = stdenv.lib.licenses.gpl3;
      };

  haskellPackages = if compiler == "default"
                       then pkgs.haskellPackages
                       else pkgs.haskell.packages.${compiler};

  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;

  drv = variant (haskellPackages.callPackage f {});

in

  if pkgs.lib.inNixShell then drv.env else drv

【问题讨论】:

    标签: haskell nix cabal-install nix-shell


    【解决方案1】:

    我通过使用a haskell+nix tutorial 创建一个 GHC 环境来实现它。下面是我的release.nixdefault.nix 是通过cabal2nix . &gt; default.nix 生成的:(注意zlib 作为haskell 包的一部分包含在ghcWithPackages 调用中)

    let
      config = 
      {
        packageOverrides = pkgs: 
        {
          haskellPackages = pkgs.haskellPackages.override 
          {
            overrides = new: old:
            {
              interview = new.callPackage ./default.nix;
            };
          };
        };
      };
    
      pkgs = import <nixpkgs> { inherit config; };
    
      ghc = pkgs.haskellPackages.ghcWithPackages (hpkgs: with hpkgs;
        [ cabal-install
          interview
          zlib
        ]
      );
    in
    
    with pkgs;
    
    mkShell 
    { buildInputs = [ ghc ];
    }
    
    

    【讨论】:

      【解决方案2】:

      您想创建一个派生,其中包含那些作为依赖项。有一个名为runCommand 的简单构建器,它运行你给它的脚本。对于 shell.nix,builder 并不会真正被使用,它只是用来提供一个 shell,所以你可以给它一个空脚本:

      with import <nixpkgs> { };
      
      runCommand "my-shell" {
        buildInputs = [ zlib ];
      } ""
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2021-01-11
        • 1970-01-01
        相关资源
        最近更新 更多