你如何在 nix 中从 haskell 包(使用堆栈/cabal)构建可执行文件?

How do you build an executable from haskell packages (which use stack / cabal) in nix?

我正在寻找与此类似的内容:

shell.nix

{ pkgs ? import <nixpkgs> {} }:
let
  threadscope = ...
  speedscope = ...
in
  stdenv.mkDerivation {
    name = "haskell-env";
    nativeBuildInputs = [
      # Haskell tools
      ghcid ghc

      # Profiling tools
      threadscope
      speedscope
    ];
  }

然后我可以使用 nix-shell:

% nix-shell
...
nix-shell % threadscope <some-commands>
nix-shell % speedscope <some-commands>

您通常只是从 github / hackage / stackage 的源代码构建还是使用 pkgs.haskellPackages.<my-package>

我通常使用 haskellPackages 的工具。

如果你只想要一个带工具的shell,你可以使用这样的表达式。

{ pkgs ? import <nixpkgs> {} }:

let
  # Select a package set. haskellPackages is recommended, but
  # if you need a different ghc, use pkgs.haskell.packages.ghc8102 for example
  haskellPackages = pkgs.haskellPackages;

in
  pkgs.mkShell {
    nativeBuildInputs = [
      # Haskell tools
      haskellPackages.ghc
      haskellPackages.ghcid

      # Profiling tools
      haskellPackages.threadscope
      # pkgs.speedscope (not packaged yet)
    ];
  }

如果您想要一个带有特定预编译库的 shell,您可以使用 ghcWithPackages 函数而不是 ghc。如果您想要本地 Haskell 包的预编译依赖项,您可以将 pkgs.mkShell 替换为 the haskellPackages.shellFor function

如果您想打包 speedscope,Nixpkgs 手册文档 the packaging process for node packages