Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Настройка

default.nix

{ stdenv, haskellngPackages }:

let
  env = haskellngPackages.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;
    haskellngPackages = pkgs.haskellngPackages;
  }

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

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

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

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

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

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

Файл, где haskellNgPackages определен

Модуль haskell-ng

Папка файла haskell

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

Все пакеты в haskell-ng определены в hackage-packages.nix. Они построены с использованием cabal.mkDerivation.

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

let haskellPackages' = haskellngPackages.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.haskellngPackages.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, поэтому может быть лучший способ сделать это.