【问题标题】:use cabal2nix to create local nix environment for packages that aren't in nixpkgs使用 cabal2nix 为不在 nixpkgs 中的包创建本地 nix 环境
【发布时间】:2015-01-28 16:27:28
【问题描述】:

我目前正在 NixOS 上开发一个 Yesod Web 应用程序。我正在使用 default.nix 文件,如 O'Charles' blog post 中所述:

{ haskellPackages ? (import <nixpkgs> {}).haskellPackages }:

haskellPackages.cabal.mkDerivation (self: {
  pname = "myblog";
  version = "0.0.0";
  src = ./.;
  isLibrary = true;
  isExecutable = true;
  buildDepends = with haskellPackages; [
    aeson bson conduit dataDefault fastLogger hjsmin
    httpConduit monadControl monadLogger mongoDB persistent
    #persistentMongoDB
    persistentTemplate poolConduit shakespeare text
    waiExtra waiLogger warp yaml yesod yesodAuth
    yesodCore yesodDefault yesodForm yesodStatic
  ];
  testDepends = with haskellPackages; [
    hspec monadLogger persistent
    #persistentMongoDB
    resourcet transformers yesod yesodCore yesodTest
  ];
  buildTools = with haskellPackages; [
    cabalInstall ghcMod yesodBin
  ];
  jailbreak = true;
})

这工作得很好。我可以像平常一样使用yesod 二进制和cabal。但是,我遇到了一个问题。运行cabal haddock 时,出现以下错误:

Running Haddock for mycoolblog-0.0.0...
Preprocessing library mycoolblog-0.0.0...
Warning: The documentation for the following packages are not installed. No
links will be generated to these packages: persistent-mongoDB-2.1.1
<command line>: cannot satisfy -package-id aeson-0.8.0.2-9e93bdd6f8e68379314dd5f31414f87f
    (use -v for more information)

对此进行谷歌搜索会出现以下链接:github: cabal haddock 'cannot satisfy -package-id' #2468。好像是说应该使用 ghcWithPackages。

谷歌搜索 ghcWithPackages 会找到 O'Charles'(个人?)wiki on Nix。它有一个使用ghcWithPackages 开发已经在nixpkgs 中的包的示例,但是我无法让它与不在nixpkgs(我的cms/blog)中的包一起工作。

按照 O'Charles wiki 上的描述进行设置并运行 nix-shell -v,我收到以下错误:

evaluating file `/nix/store/an4sg7cxi1ii3vids8417kajl3ss13vd-nix-1.7/share/nix/corepkgs/derivation.nix'
error: cannot auto-call a function that has an argument without a default value (`cabal')

为什么会出现上述错误?如何为不在 nixpkgs 中的 Haskell 项目编写 default.nixshell.nix?理想情况下,它会使用ghcWithPackages,以便cabal haddock 工作。

【问题讨论】:

    标签: haskell yesod cabal-install nixos


    【解决方案1】:

    在使用O'Charles' Nix wiki 上的方法后,我能够得到这个工作。我之前没有确定为什么这种方法不起作用。

    基本上,首先运行cabal2nix。然后创建一个通用的 shell.nix(可以在所有 Haskell 包之间共享)。

    $ cabal2nix --jailbreak --sha256=X ./$cabal > default.nix
    $ sed -i 's#sha = .*#src = builtins.filterSource (path: type: type != "unknown") ./.;#' default.nix
    $ cat - > shell.nix <<EOF
    let
      pkgs = import <nixpkgs> {};
      haskellPackages = pkgs.haskellPackages.override {
        extension = self: super: {
          thispackage = self.callPackage ./. {};
        };
      };
    in pkgs.myEnvFun {
         name = haskellPackages.thispackage.name;
         buildInputs = [
           (haskellPackages.ghcWithPackages (hs: ([
             hs.cabalInstall
             hs.hscolour
             hs.ghcMod
           ] ++ hs.thispackage.propagatedNativeBuildInputs)))
         ];
       }      
    EOF
    $ nix-shell
    

    【讨论】:

    • “O'Charles' Nix wiki”后面的链接没有目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2019-05-03
    • 2019-01-10
    • 1970-01-01
    • 2022-01-01
    • 2017-04-25
    相关资源
    最近更新 更多