Ich habe mich schon eine Weile für Nix interessiert und dachte mir, ich würde es endlich versuchen, um ein neues Haskell-Projekt zu starten.Erstelle eine einfache Haskell-Bibliothek mit nix
ich mit der Verzeichnisstruktur begann
project.cabal
src/Lib.hs
Wo die Kabalen-Datei den folgenden Inhalt hat:
name: project
version: 0.1.0.0
build-type: Simple
license: MIT
cabal-version: >= 1.18
library
exposed-modules: Lib
build-depends: base < 5
hs-source-dirs: src
default-language: Haskell2010
und Lib.hs hat
module Lib where
hello :: Int -> IO()
hello x = putStrLn (show x)
Wie Sie sehen können, Es ist ganz einfach. Wenn ich cabal build
ausführe, scheint es glücklich zu sein. Beachte, dass ich kein Hakkell-Experte bin, also mache ich hier vielleicht einen Anfängerfehler.
Um dies mit Nix zu bauen, habe ich https://github.com/Gabriel439/haskell-nix gelesen, um meine Informationen zu erhalten. Ich habe cabal2nix . > default.nix
ausgeführt, um eine Nix-Version meiner Cabal-Datei zu erhalten. Ich habe dann eine release.nix
Datei erstellt, um es tatsächlich zu bauen. Der Inhalt der beiden Dateien sind wie folgt:
default.nix
{ mkDerivation, base, stdenv }:
mkDerivation {
pname = "project";
version = "0.1.0.0";
src = ./.;
libraryHaskellDepends = [ base ];
license = stdenv.lib.licenses.mit;
}
release.nix
let
pkgs = import <nixpkgs> { };
in
pkgs.haskellPackages.callPackage ./default.nix { }
Nachdem Sie das getan, ich nix-build release.nix
ausgeführt und bekam zurück
these derivations will be built:
/nix/store/p481alkpm89712n3hnwai0nxhmjrm8b2-project-0.1.0.0.drv
building path(s) ‘/nix/store/yszy2a6wd88pf6zlw0nw99l5wzvc0s9x-project-0.1.0.0’
setupCompilerEnvironmentPhase
Build with /nix/store/d5w12a8bprd2518xnqp1cwh3rbjiagyx-ghc-8.0.1.
unpacking sources
unpacking source archive /nix/store/fsn4b9w54h2jdpv546nwvy82vnkszl1w-project
source root is project
patching sources
compileBuildDriverPhase
setupCompileFlags: -package-db=/tmp/nix-build-project-0.1.0.0.drv-0/package.conf.d -j4 -threaded
[1 of 1] Compiling Main (/nix/store/4mdp8nhyfddh7bllbi7xszz7k9955n79-Setup.hs, /tmp/nix-build-project-0.1.0.0.drv-0/Main.o)
Linking Setup ...
...
...
Building project-0.1.0.0...
Preprocessing library project-0.1.0.0...
dist/build/Lib_o_split: getDirectoryContents: does not exist (No such file or
directory)
builder for ‘/nix/store/p481alkpm89712n3hnwai0nxhmjrm8b2-project-0.1.0.0.drv’ failed with exit code 1
error: build of ‘/nix/store/p481alkpm89712n3hnwai0nxhmjrm8b2-project-0.1.0.0.drv’ failed
Was natürlich nicht gut ist. Welchen Fehler mache ich hier? Ich war in einem ähnlichen Versuch erfolgreich, der eine ausführbare Datei anstelle einer Bibliothek erstellte, also vermute ich, dass es etwas damit zu tun hat. Das Github-Repo, dem ich folgte, verwendete auch eine ausführbare Datei.
Bit einer Aufnahme im Dunkeln, aber fügt 'enableSplitObjs = false;' zu Ihrer default.nix Datei Hilfe überhaupt hinzu? Wenn der Fehler mit "error: assertion failed at.." ausfällt, können Sie stattdessen 'enableDeadCodeElimination = false;' versuchen? – ppb
@ppb 'enableSplitObjs = false;' hat es korrekt erstellt. Warum repariert das die Dinge? Gibt es einen Ort, an dem alle Haskell Nix Optionen dokumentiert sind? Auch, wenn Sie dies zu einer Antwort machen, werde ich es akzeptieren. – phil