【问题标题】:How do I use the new haskell-ng infrastructure on NixOS?如何在 NixOS 上使用新的 haskell-ng 基础架构?
【发布时间】:2015-05-16 00:21:06
【问题描述】:

如何使用新的 haskell-ng 基础架构在 NixOS 上设置简单的 Haskell 开发环境?

【问题讨论】:

    标签: haskell ghc nixos nix


    【解决方案1】:

    这是基于每个项目的一种方法。我正在开发一个 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

    The haskell packages module

    The haskell-module folder

    更新:在启用分析的情况下构建依赖项

    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 公开为顶级包,因此您可以轻松访问 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 还是很陌生,所以可能有更好的方法来做到这一点。

    【讨论】:

    • 感谢您发布此信息!我觉得有帮助的一件事是如何管理分析,这要求所有依赖项都必须使用分析支持来构建。我找到了一种方法,但我并不完全理解它,并且它目前适用于全球,因此最好了解如何让单个包的环境需要其依赖项的分析版本。
    • @LeviPearson 不用担心!只是认为将这些信息放在易于访问的地方会很好。请参阅我关于覆盖如何构建包并特别添加分析的编辑!
    • 我是 NixOS 的新手,在一些帮助下,我终于在 Haskell NG 下构建了我的一个 haskell 项目。但是我的 default.nix 看起来像你的 shell.nix,我的 shell.nix 看起来像你的 default.nix。您是否在答案中交换了文件名,或者文件名无关紧要?
    • @musicmatze 如果你的包需要一个运行的 postgresql 服务器,你的default.nix 应该只定义使用 postgresql 所需的库。它不会定义系统需要运行哪些服务。
    • @musicmatze 以 nginx 为例,default.nix-file 只定义了它的构建、安装和运行的依赖关系。 nginx 的部署方式(是否使用 systemd 启动,是否需要可变目录来存储数据等)在 NixOS service.nix-file 中定义。
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多