Tôi đã quan tâm đến Nix trong một thời gian, và tôi nghĩ cuối cùng tôi sẽ cố gắng sử dụng nó để bắt đầu một dự án haskell mới.Xây dựng thư viện haskell đơn giản sử dụng nix
tôi bắt đầu với cấu trúc thư mục
project.cabal
src/Lib.hs
Trong trường hợp tập tin cabal có các nội dung sau:
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
và Lib.hs có
module Lib where
hello :: Int -> IO()
hello x = putStrLn (show x)
Như bạn có thể thấy, nó khá đơn giản. Khi tôi thực hiện cabal build
, nó có vẻ là hạnh phúc. Lưu ý rằng tôi không có chuyên gia haskell bởi bất kỳ phương tiện, vì vậy tôi có thể làm cho một số sai lầm người mới bắt đầu ở đây.
Để xây dựng điều này với Nix, tôi đã đọc https://github.com/Gabriel439/haskell-nix để nhận thông tin của mình. Tôi đã thực hiện cabal2nix . > default.nix
để nhận phiên bản Nix của tệp cabal của tôi. Sau đó tôi đã tạo một tệp release.nix
để thực sự tạo tệp. Nội dung của hai tập tin như sau:
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 { }
Sau khi thực hiện điều này, tôi thực hiện nix-build release.nix
và đã trở lại
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
Điều này tất nhiên là không tốt. Tôi đang làm gì ở đây? Tôi đã thành công trong một nỗ lực tương tự đã được xây dựng một thực thi thay vì một thư viện, vì vậy tôi nghi ngờ nó có cái gì để làm với điều đó. Các repo github tôi đã theo dõi đã được sử dụng một thực thi là tốt.
Bit của ảnh trong bóng tối nhưng không thêm 'enableSplitObjs = false;' vào tệp mặc định.nix của bạn sẽ giúp bạn? Nếu lỗi đó xảy ra với 'error: assertion failed at..' bạn có thể thử' enableDeadCodeElimination = false; 'thay thế không? – ppb
@ppb 'enableSplitObjs = false;' làm cho nó xây dựng chính xác. Tại sao điều đó sửa chữa mọi thứ? Có một nơi mà tất cả các tùy chọn haskell nix được ghi lại không? Ngoài ra, nếu bạn thực hiện câu trả lời này, tôi sẽ chấp nhận nó. – phil