如何在NixOS上使用新的haskell-ng基础架构?

问题描述 投票:24回答:1

如何使用新的haskell-ng基础架构在NixOS上设置简单的Haskell开发环境?

haskell ghc nixos nix
1个回答
31
投票

这是在每个项目的基础上进行此操作的一种方法。我正在开发一个Yesod webbapp,所以我使用我当前的设置作为示例。

在我的项目文件夹中,我有两个文件:default.nix(指定如何构建我的项目)和shell.nix(指定如何设置构建输入)。

这样我就可以运行nix-shell了,它让我进入了一个安装了ghc的环境,并提供了所提供的包和路径。

设置

default.nix

{ stdenv, haskellPackages }:

let
  env = haskellPackages.ghcWithPackages (p: with p; [
    aeson
    bytestring
    cabal-install
    classy-prelude
    classy-prelude-conduit
    classy-prelude-yesod
    conduit
    containers
    data-default
    directory
    fast-logger
    file-embed
    hjsmin
    http-conduit
    monad-control
    monad-logger
    persistent
    persistent-postgresql
    persistent-template
    safe
    shakespeare
    template-haskell
    text
    time
    unordered-containers
    vector
    wai-extra
    wai-logger
    warp
    yaml
    yesod
    yesod-auth
    yesod-bin
    yesod-core
    yesod-form
    yesod-static
  ]);
in
  stdenv.mkDerivation {
    name        = "project-name";
    buildInputs = [env];
    shellHook   = ''
      export NIX_GHC="${env}/bin/ghc"
      export NIX_GHCPKG="${env}/bin/ghc-pkg"
      export NIX_GHC_DOCDIR="${env}/share/doc/ghc/html"
      export NIX_GHC_LIBDIR=$( $NIX_GHC --print-libdir )
    '';
  }

shell.nix

{ pkgs ? (import <nixpkgs> {}) }:

(import ./default.nix) {
    stdenv            = pkgs.stdenv;
    haskellPackages = pkgs.haskellPackages;
  }

更多信息

有关更多信息,请阅读:

A Journey into the Haskell NG infrastructure: Part I

A Journey into the Haskell NG infrastructure: Part II

这些链接解释了haskell-ng如何工作以及将来会发生什么。

如果你想深入了解haskell-ng基础设施的来源,我建议:

The file where haskellPackages is defined

The haskell packages module

The haskell-module folder

更新:通过启用性能分析构建依赖性

haskell-ng中的所有包都在hackage-packages.nix中定义。它们是使用cabal.mkDerivation构建的。

如果要覆盖包的构建方式,则需要覆盖在该包上调用mkDerivation的方式。 In the Haskell Wiki you have information on how to do that.。基本上你定义了一个新的haskellPackages,它包含你想要的每个包的覆盖:

let haskellPackages' = haskellPackages.override {
       overrides = self: super: {
         fullstop = super.fullstop.override {
           mkDerivation = (attrs: self.mkDerivation (attrs // { doCheck = false; }));
         };
       };
     };

这可能非常繁琐,因此在lib.nix文件haskell-modules中可以使用辅助函数。

文件haskell-ng导入lib.nix并暴露它。并且haskell-ng作为顶级包公开,因此您可以轻松访问lib功能。

假设我们有一个包想要在文本库上启用分析,我们可以这样做:

{ pkgs ? (import <nixpkgs> {}).pkgs }:

let
  lib = pkgs.haskell-ng.lib;
  env = pkgs.haskellPackages.ghcWithPackages (p: with p; [
    (lib.enableLibraryProfiling text)
  ]);
in
  pkgs.stdenv.mkDerivation {
    name        = "hello-world-wide-web";
    buildInputs = [env];
    shellHook   = ''
      export NIX_GHC="${env}/bin/ghc"
      export NIX_GHCPKG="${env}/bin/ghc-pkg"
      export NIX_GHC_DOCDIR="${env}/share/doc/ghc/html"
      export NIX_GHC_LIBDIR=$( $NIX_GHC --print-libdir )
    '';
  }

本周末我通过浏览haskell-ng的nix源并测试它来找到这些信息。我仍然是NixOS和nix的新手,所以可以有更好的方法来做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.