Как использовать новую инфраструктуру haskell - ng на NixOS?

Как настроить простую среду разработки Haskell на NixOS с использованием новой инфраструктуры haskell-ng?

1 ответов


здесь один из способов делать это на основе проекта. Я разрабатываю yesod webbapp, поэтому я использую свою текущую настройку в качестве примера.

в моей папке проекта у меня есть два файла: default.nix (указывает, как построить мой проект) и shell.nix (указывает, как настроить входные данные сборки).

таким образом, я могу просто запустить nix-shell и он бросает меня в среду, в которой установлен ghc с предоставленными пакетами и путями установки.

в setup

по умолчанию.Никс!--26-->

{ 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.Никс!--26-->

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

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

дополнительная информация

для получения дополнительной информации вы можете прочитать:

Путешествие в инфраструктуру Haskell NG: Часть I

Путешествие в инфраструктуру Haskell NG: Часть II

эти ссылки объясняют, как работает haskell-ng и что произойдет в будущее.

если вы хотите покопаться в источнике инфраструктуры haskell-ng, я предлагаю:

файл, в котором определяется haskellPackages

модуль пакетов haskell

папка модуля haskell

Update: построение зависимостей с включенным профилированием

все пакеты в haskell-ng определены в hackage-пакеты.Никс!--38-->. Они построенный с помощью cabal.mkDerivation.

если вы хотите переопределить Способ построения пакета, вам нужно переопределить how mkDerivation вызывается на этом пакете. в Вики Haskell у вас есть информация о том, как это сделать.. В основном вы определяете новый haskellPackages С переопределениями вы хотите для каждого пакета:

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

это может быть довольно утомительно делать, поэтому в файле lib.Никс!--38--> на 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 )
    '';
  }

я нашел эту информацию в эти выходные, пройдя через источник nix для haskell-ng и протестировав его. Я все еще новичок в NixOS и nix, поэтому может быть лучший способ сделать этот.