3 个版本

0.1.2 2023 年 6 月 11 日
0.1.1 2023 年 6 月 11 日
0.1.0 2023 年 6 月 4 日

#902 in 开发工具

GPL-3.0-or-later

95KB
2K SLoC

idr2nix

idr2nix 是一个正在开发中的工具,用于将 Idris 2 项目适配到 Nix flakes,使用 idris2-pack 数据库

idr2nix 命令行使用

安装

建议将此仓库添加到您的 nix flakes 注册表,并使用 nix run

nix registry add idr2nix 'git+https://git.sr.ht/~thatonelutenist/idr2nix?ref=trunk'
nix run idr2nix -- --help

本说明书的其余部分将假设您已经有了此注册条目

初始化和更新

状态目录(默认为 .idr2nix)必须首先初始化,建议在项目的根目录中进行,但也可以在系统上的任何位置进行

nix run idr2nix -- init

这将自动拉取 pack 数据库的副本,并将集合设置为最新夜间版本

可以使用 update-pack 子命令更新 pack 数据库,并使用 -u/--update-collection 标志将正在使用的集合更改为当前最新夜间版本

# Just update the pack database
nix run idr2nix -- update-pack
# Also update the collection in use to latest nightly
nix run idr2nix -- update-pack -u

生成 sources.json

gen-sources 子命令用于生成 sources.json 文件,该文件用于 nix 代码构建 Idris 包和开发环境,作为一个纯操作。JSON 输出锁定编译器的确切版本以及所有依赖项,包括 nix 需要生成固定输出衍生的哈希值。

输出将提供在 stdout 上,因此您可能希望将其重定向到文件

nix run idr2nix -- gen-sources package.ipkg > sources.json

这将解析提供的 ipkg,使用 pack 数据库解析依赖项,预取它们以生成哈希值,然后输出源 JSON。

处理多个 ipkg 文件

子命令 gen-sources 可以接受多个 ipkgs 作为参数,生成一个包含所有提供的 ipkgs 的所有依赖的单个合并的 sources.json

nix run idr2nix -- gen-sources package1.ipkg package2.ipkg > sources.json

idr2nix flake 使用方法

首先,将 idr2nix 添加到您的输入中,可选地指示它遵循您的 nixpkgs

{
  inputs = {
    idr2nix.url = "git+https://git.sr.ht/~thatonelutenist/idr2nix?ref=trunk";
    idr2nix.inputs.nixpkgs.follows = "nixpkgs";
  };
}

打包单个二进制文件

idris.single 属性是一个函数,用于生成包装单个二进制输出和相关 devShell 的 Idris 项目的 flake 内容,它接受以下参数

  • packageName:要生成的包的名称
  • sources:生成的源 JSON 的内容
  • ipkg:从其中构建二进制的 ipkg
  • src:构建 Idris 项目的位置(通常是 ./.
  • idris2api:默认情况下是否在生成的 Idris 前缀中包含 idris2api(默认为 false
  • extraDeps:一个函数,接受 nixpkgs 包集合作为输入,并返回要包含在生成的 Idris2 包的 buildInputs 中的包列表,默认为空
  • extraNativeDeps:一个函数,接受 nixpkgs 包集合作为输入,并返回要包含在生成的 Idris2 包的 nativeBuildInputs 中的包列表,默认为空
  • extraBuildArgs:一个属性集,它与用于构建 Idris 前缀的 mkDerivation 参数以及用于构建 devShell 的 mkShell 参数合并

默认情况下,extraDepsextraNativeDeps 的内容都将包含在生成的 devShell 中。

一个示例 flake.nix 打包 pack,它需要 idris2api

{
  inputs = { idr2nix.url = "git+https://git.sr.ht/~thatonelutenist/idr2nix?ref=trunk"; };
  description = "Simple Test Package";

  outputs = { self, nixpkgs, idr2nix }:
    idr2nix.idris.single {
      packageName = "pack";
      sources = builtins.fromJSON (builtins.readFile ./pack.json);
      ipkg = "pack.ipkg";
      src = ./.;
      idris2api = true;
    };
}

打包多个二进制文件

idris.multiple 属性是一个函数,用于生成包装多个二进制输出和相关 devShell 的 Idris 项目的 flake 内容,它接受以下参数

  • packageDetails:一个包含每个要生成的二进制包的 nameipkg 值的 attrSets 列表
  • sources:生成的源 JSON 的内容
  • src:构建 Idris 项目的位置(通常是 ./.
  • idris2api:默认情况下是否在生成的 Idris 前缀中包含 idris2api(默认为 false
  • extraDeps:一个函数,接受 nixpkgs 包集合作为输入,并返回要包含在生成的 Idris2 包的 buildInputs 中的包列表,默认为空
  • extraNativeDeps:一个函数,接受 nixpkgs 包集合作为输入,并返回要包含在生成的 Idris2 包的 nativeBuildInputs 中的包列表,默认为空
  • extraBuildArgs:一个属性集,它与用于构建 Idris 前缀的 mkDerivation 参数(对于所有包)以及用于构建 devShell 的 mkShell 参数合并

默认情况下,extraDepsextraNativeDeps 的内容都将包含在生成的 devShell 中。

一个示例 flake.nix 打包 packmicropack,它们都来自 pack 仓库

{
  inputs = { idr2nix.url = "git+https://git.sr.ht/~thatonelutenist/idr2nix?ref=trunk"; };
  description = "Simple Test Package";

  outputs = { self, nixpkgs, idr2nix }:
    idr2nix.idris.multiple {
      sources = builtins.fromJSON (builtins.readFile ./pack.json);
      packageDetails = [
        {
          name = "pack";
          ipkg = "pack.ipkg";
        }
        {
          name = "micropack";
          ipkg = "micropack.ipkg";
        }
      ];
      defaultPackage = "pack";
      src = ./.;
      idris2api = true;
    };
}

依赖项

~25MB
~513K SLoC