3 个版本
0.1.2 | 2023 年 6 月 11 日 |
---|---|
0.1.1 | 2023 年 6 月 11 日 |
0.1.0 | 2023 年 6 月 4 日 |
#902 in 开发工具
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
:从其中构建二进制的 ipkgsrc
:构建 Idris 项目的位置(通常是./.
)idris2api
:默认情况下是否在生成的 Idris 前缀中包含 idris2api(默认为false
)extraDeps
:一个函数,接受nixpkgs
包集合作为输入,并返回要包含在生成的 Idris2 包的buildInputs
中的包列表,默认为空extraNativeDeps
:一个函数,接受nixpkgs
包集合作为输入,并返回要包含在生成的 Idris2 包的nativeBuildInputs
中的包列表,默认为空extraBuildArgs
:一个属性集,它与用于构建 Idris 前缀的mkDerivation
参数以及用于构建 devShell 的mkShell
参数合并
默认情况下,extraDeps
和 extraNativeDeps
的内容都将包含在生成的 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
:一个包含每个要生成的二进制包的name
和ipkg
值的 attrSets 列表sources
:生成的源 JSON 的内容src
:构建 Idris 项目的位置(通常是./.
)idris2api
:默认情况下是否在生成的 Idris 前缀中包含 idris2api(默认为false
)extraDeps
:一个函数,接受nixpkgs
包集合作为输入,并返回要包含在生成的 Idris2 包的buildInputs
中的包列表,默认为空extraNativeDeps
:一个函数,接受nixpkgs
包集合作为输入,并返回要包含在生成的 Idris2 包的nativeBuildInputs
中的包列表,默认为空extraBuildArgs
:一个属性集,它与用于构建 Idris 前缀的mkDerivation
参数(对于所有包)以及用于构建 devShell 的mkShell
参数合并
默认情况下,extraDeps
和 extraNativeDeps
的内容都将包含在生成的 devShell
中。
一个示例 flake.nix
打包 pack
和 micropack
,它们都来自 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