新しい haskell-ng インフラストラクチャを使用して、NixOS で単純な Haskell 開発環境をセットアップするにはどうすればよいですか?
1 に答える
プロジェクトごとに行う方法の 1 つを次に示します。私は Yesod webbapp を開発しているので、現在のセットアップを例として使用しています。
default.nix
私のプロジェクト フォルダーには、(プロジェクトのビルド方法を指定する) とshell.nix
(ビルド入力のセットアップ方法を指定する) の2 つのファイルがあります。
このようにして実行するだけ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;
}
詳しくは
詳細については、次を参照してください。
Haskell NG インフラストラクチャへの旅: パート I
Haskell NG インフラストラクチャへの旅: パート II
これらのリンクは、haskell-ng がどのように機能し、将来何が起こるかを説明しています。
haskell-ng インフラストラクチャのソースを掘り下げたい場合は、次のことをお勧めします。
更新: プロファイリングを有効にして依存関係を構築する
haskell-ng のすべてのパッケージは hackage-packages.nix で定義されています。を使用して構築されてcabal.mkDerivation
います。
パッケージのビルド方法をオーバーライドしたい場合はmkDerivation
、そのパッケージでの の呼び出し方法をオーバーライドする必要があります。Haskell Wiki には、その方法に関する情報があります。. 基本的に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に慣れていないので、これを行うためのより良い方法があるかもしれません.