¿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?