如何在 NixOS 上使用新的 haskell-ng 基础架构?
How do I use the new haskell-ng infrastructure on NixOS?
如何使用新的 haskell-ng 基础架构在 NixOS 上设置一个简单的 Haskell 开发环境?
这是一种 在每个项目的基础上进行的方法。我正在开发 Yesod webbapp,所以我使用我当前的设置作为示例。
在我的项目文件夹中,我有两个文件:default.nix
(指定如何构建我的项目)和shell.nix
(指定如何设置构建输入)。
这样我就可以 运行 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;
}
更多信息
更多信息您可以阅读:
A Journey into the Haskell NG infrastructure: Part I
A Journey into the Haskell NG infrastructure: Part II
这些链接解释了 haskell-ng 的工作原理以及将来会发生什么。
如果你想深入了解 haskell-ng 基础设施的源代码,我建议:
The file where haskellPackages is defined
更新:在启用分析的情况下构建依赖关系
haskell-ng 中的所有包都在 hackage-packages.nix 中定义。它们是使用 cabal.mkDerivation
.
构建的
如果您想覆盖构建包的方式,您需要覆盖在该包上调用 mkDerivation
的方式。 In the Haskell Wiki you have information on how to do that.。基本上你定义一个新的 haskellPackages
与你想要的每个包的覆盖:
let haskellPackages' = haskellPackages.override {
overrides = self: super: {
fullstop = super.fullstop.override {
mkDerivation = (attrs: self.mkDerivation (attrs // { doCheck = false; }));
};
};
};
这可能会非常繁琐,因此您可以使用 haskell-modules
中文件 lib.nix 中的辅助函数。
文件 haskell-ng
导入 lib.nix
并公开它。 haskell-ng
作为顶级包公开,因此您可以轻松访问库函数。
假设我们有一个包想要在文本库上启用分析,我们可以这样做:
{ 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 还是很陌生,所以可能有更好的方法来做到这一点。
如何使用新的 haskell-ng 基础架构在 NixOS 上设置一个简单的 Haskell 开发环境?
这是一种 在每个项目的基础上进行的方法。我正在开发 Yesod webbapp,所以我使用我当前的设置作为示例。
在我的项目文件夹中,我有两个文件:default.nix
(指定如何构建我的项目)和shell.nix
(指定如何设置构建输入)。
这样我就可以 运行 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;
}
更多信息
更多信息您可以阅读:
A Journey into the Haskell NG infrastructure: Part I
A Journey into the Haskell NG infrastructure: Part II
这些链接解释了 haskell-ng 的工作原理以及将来会发生什么。
如果你想深入了解 haskell-ng 基础设施的源代码,我建议:
The file where haskellPackages is defined
更新:在启用分析的情况下构建依赖关系
haskell-ng 中的所有包都在 hackage-packages.nix 中定义。它们是使用 cabal.mkDerivation
.
如果您想覆盖构建包的方式,您需要覆盖在该包上调用 mkDerivation
的方式。 In the Haskell Wiki you have information on how to do that.。基本上你定义一个新的 haskellPackages
与你想要的每个包的覆盖:
let haskellPackages' = haskellPackages.override {
overrides = self: super: {
fullstop = super.fullstop.override {
mkDerivation = (attrs: self.mkDerivation (attrs // { doCheck = false; }));
};
};
};
这可能会非常繁琐,因此您可以使用 haskell-modules
中文件 lib.nix 中的辅助函数。
文件 haskell-ng
导入 lib.nix
并公开它。 haskell-ng
作为顶级包公开,因此您可以轻松访问库函数。
假设我们有一个包想要在文本库上启用分析,我们可以这样做:
{ 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 还是很陌生,所以可能有更好的方法来做到这一点。