haskell ghc nixos nix

¿Cómo uso la nueva infraestructura de haskell-ng en NixOS?



ghc (1)

Aquí hay una forma de hacerlo por proyecto. Estoy desarrollando una webbapp de Yesod, así que estoy usando mi configuración actual como ejemplo.

En la carpeta de mi proyecto tengo dos archivos: default.nix (especifica cómo compilar mi proyecto) y shell.nix (especifica cómo configurar entradas de compilación).

De esta manera, simplemente puedo ejecutar nix-shell y me coloca en un entorno que tiene instalado ghc con la configuración de paquetes y rutas provista.

La puesta en marcha

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; }

Más información

Para más información puedes leer:

Un viaje a la infraestructura de Haskell NG: Parte I

Un viaje a la infraestructura de Haskell NG: Parte II

Esos enlaces explican cómo funciona haskell-ng y qué ocurrirá en el futuro.

Si desea profundizar en la fuente de la infraestructura de haskell-ng, sugiero:

El archivo donde se define haskellPackages

El módulo de paquetes haskell.

La carpeta del módulo haskell.

Actualización: Construyendo dependencias con perfiles habilitados.

Todos los paquetes en haskell-ng se definen en hackage-packages.nix . Se construyen utilizando cabal.mkDerivation .

Si desea anular la forma en que se construye un paquete, debe anular la forma en que se llama a mkDerivation en ese paquete. En la Wiki de Haskell tienes información sobre cómo hacerlo. . Básicamente, usted define un nuevo haskellPackages con las anulaciones que desea para cada paquete:

let haskellPackages'' = haskellPackages.override { overrides = self: super: { fullstop = super.fullstop.override { mkDerivation = (attrs: self.mkDerivation (attrs // { doCheck = false; })); }; }; };

Esto puede ser bastante tedioso, por lo tanto, hay funciones de ayuda en el archivo lib.nix en haskell-modules lib.nix que puede usar.

El archivo haskell-ng importa lib.nix y lo expone. Y haskell-ng está expuesto como un paquete de nivel superior para que pueda acceder a las funciones lib fácilmente.

Digamos que tenemos un paquete que quiere habilitar la creación de perfiles en la biblioteca de texto, podemos hacer algo como esto:

{ 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 ) ''''; }

Encontré esta información este fin de semana yendo a la fuente de nix para haskell-ng y probándola. Todavía soy bastante nuevo en NixOS y nix, así que podría haber una mejor manera de hacerlo.

¿Cómo configuro un entorno de desarrollo Haskell simple en NixOS usando la nueva infraestructura de haskell-ng?