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