UP | HOME

[NOTE] idris2 與 nix

這裡記錄了用 nix flakes 開發 idris2 專案的方法,首先在所有工作開展之前,要建立一個叫做 flake.nix 的檔案。 這個檔案的內容會分成三個部分

  1. description 是一個字串,描述這個專案
  2. inputs 是一串專案中想要使用的套件,由於是一群結構,所以有一點點複雜。這裡也只用了 .url 指定來源跟用 .inputs 覆蓋引用的程式庫的來源而已
  3. outputs 則是專案自己的東西,包含怎麼安裝,開發環境要有什麼都是在這裡指定的!
{
  description = "my project";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs";
    flake-utils.url = "github:numtide/flake-utils";
    idris-lang.url = "github:idris-lang/Idris2";
    idris-lang.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs = { self, nixpkgs, flake-utils, idris-lang }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};
        stdenv = pkgs.stdenv;

        idris2 = idris-lang.packages.${system}.idris2;
        rlwrap = pkgs.rlwrap;

        my-pkg = stdenv.mkDerivation {
          name = "my-pkg";
          version = "0.0.1";
          src = ./.;

          buildInputs = [ idris2 ];
          buildPhase = ''
            idris2 --build ./package.ipkg
          '';
          installPhase = ''
            export HOME=$(pwd)
            mkdir -p $out/bin
            mv ./build/exec/* $out/bin/
          '';
        };
      in rec {
        packages.default = my-pkg;
        devShells.default = pkgs.mkShell {
          buildInputs = [ idris2 rlwrap my-pkg ];
        };
      })
}

上面的檔案只要把 my pkg 的地方改一改應該就可以使用了,可以用 nix flake check 檢查這個 flake 有沒有跑過了,沒有就會開始拉取依賴;而用 nix build . 就會開始對專案進行建構。

Date: 2023-01-01 Sun 00:00
Author: Lîm Tsú-thuàn