gpt4 book ai didi

haskell - 使用 cabal2nix 为不在 nixpkgs 中的包创建本地 nix 环境

转载 作者:行者123 更新时间:2023-12-02 14:08:15 25 4
gpt4 key购买 nike

我目前正在 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/博客)。

按照 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 工作。

最佳答案

在使用 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

关于haskell - 使用 cabal2nix 为不在 nixpkgs 中的包创建本地 nix 环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com