25

新しい haskell-ng インフラストラクチャを使用して、NixOS で単純な Haskell 開発環境をセットアップするにはどうすればよいですか?

4

1 に答える 1

32

プロジェクトごとに行う方法の 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 インフラストラクチャのソースを掘り下げたい場合は、次のことをお勧めします。

haskellPackages が定義されているファイル

haskell パッケージ モジュール

haskell-module フォルダー

更新: プロファイリングを有効にして依存関係を構築する

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に慣れていないので、これを行うためのより良い方法があるかもしれません.

于 2015-03-13T13:33:45.430 に答える