Как настроить простую среду разработки Haskell на NixOS с использованием новой инфраструктуры haskell-ng?
Как использовать новую инфраструктуру haskell-ng на NixOS?
Ответ 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 определены в 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, поэтому может быть лучший способ сделать это.