我有一個~46 個依賴項的串列。
我制作了一個外殼,其中包括呼叫:
server = pkgs.haskellPackages.callCabal2nix "server" ./server.cabal { };
在覆寫范圍內pkgs.haskellPackages進入pkgs.myHaskellPackages.
外殼作業正常。但是,我有另一個用于構建 docker 的 nix,這需要來自以下的構建輸入:
ghc = pkgs.myHaskellPackages.ghcWithPackages (p: [ longlistofdependencies ]);
我如何指定一長串依賴項而不必手動寫出它們,callCabal2nix這首先違背了使用的目的。
let
bootstrap = import <nixpkgs> { };
nixpkgs = builtins.fromJSON (builtins.readFile ./nixpkgs-unstable.json);
src = bootstrap.fetchFromGitHub {
owner = "NixOS";
repo = "nixpkgs";
inherit (nixpkgs) rev sha256;
};
config = {
allowBroken = true;
packageOverrides = pkgs: rec {
servantSrc = pkgs.fetchFromGitHub {
owner = "haskell-servant";
repo = "servant";
rev = "73c87bc2bc0685649f2337b06ab4fdc66c4ce1dd";
sha256 = "0sw4mrncmfna30cyxrvinc1krqhfxn5dcc1ggzqfy39s0yl9q98r";
#sha256 = "0000000000000000000000000000000000000000000000000000";
} "/servant";
myHaskellPackages = pkgs.haskellPackages.override {
overrides = haskellPackagesNew: haskellPackagesOld: rec {
server =
haskellPackagesNew.callCabal2nix "server" ./server.cabal { };
servant =
haskellPackagesNew.callCabal2nix "servant" servantSrc {};
# several other overridden packages
};
};
};
};
pkgs = import src { inherit config; };
devShell = pkgs.myHaskellPackages.shellFor {
packages = p: [
p.server
];
buildInputs = with pkgs.haskellPackages; [
hlint
brittany
haskell-language-server
];
};
# Every time a dependency changes in the cabal file, this has to be edited as well.
ghc = pkgs.myHaskellPackages.ghcWithPackages (p: [
p.aeson p.aeson-qq p.base p.blaze-html p.bytestring p.cache p.containers
p.contravariant-extras p.criterion p.either p.hashable p.hasql
p.hasql-migration p.hasql-pool p.hasql-th p.hasql-transaction p.hspec
p.http-client p.http-conduit p.http-types p.immortal-queue p.lens p.linear
p.monad-logger p.mtl p.pqueue p.pretty-simple p.QuickCheck p.raw-strings-qq
p.servant-blaze p.servant-docs p.servant-server
p.string-interpolate p.text p.text-format p.time p.tuple p.unordered-containers
p.utf8-string p.vector p.vector-split p.wai p.wai-cors p.warp p.xlsx p.yaml
]);
in {
inherit devShell;
inherit ghc;
inherit pkgs;
}
ghc輸出用作docker.nix構建輸入:
let
inherit (import ./pinned-nixpkgs.nix) ghc pkgs;
pricing-server =
pkgs.stdenv.mkDerivation {
name = "my-server";
pname = "my-server";
version = "1.1.0";
src = ./.;
buildPhase = ''
ghc -O2 --make -outputdir ./tmp2 Main.hs
'';
installPhase = ''
mkdir -p $out/bin
cp Main $out/bin
cp -r ./sql $out/bin
'';
buildInputs = [ ghc ];
};
in
dockerTools.buildImage {
# irrelevant to the question.
}
uj5u.com熱心網友回復:
一個可能的解決方案是pkgs.myHaskellPackages.server.getBuildInputs.haskellBuildInputs或pkgs.myHaskellPackages.server.getCabalDeps.libraryHaskellDepends。
您可以使用 探索這些屬性或任何運算式nix repl。不過,您可能必須從 let 系結中公開一些值。在這種情況下,我只是瀏覽haskellPackages.warp了nix repl <nixpkgs>.
我還注意到您rec在疊加層中使用。這對你有用,直到它不起作用。我建議洗掉rec以避免以第三種方式訪問??屬性并改用更標準的haskellPackagesNew.servant方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416360.html
標籤:
