【问题标题】:How do you build an executable from haskell packages (which use stack / cabal) in nix?你如何在 nix 中从 haskell 包(使用 stack / cabal)构建可执行文件?
【发布时间】:2020-12-09 09:11:32
【问题描述】:

我正在寻找类似的东西:

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.&lt;my-package&gt;

【问题讨论】:

  • 我已将您的示例更改为使用更适合 shell 工具的 nativeBuildInputsbuildInputs 适用于库等,但包括次优的遗留行为。例如,buildInputs 不支持 shell 选项卡完成。不过,您会看到很多使用 buildInputs 的示例,因为它有点用,而且是最近才发生的变化。

标签: haskell nix nixpkgs


【解决方案1】:

我通常从haskellPackages拿工具。

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

{ 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多