Tvix 是 Nix 语言和包管理器的一个新实现。关于该项目的背景信息,请参阅公告文章。
Tvix 由 TVL 在我们的单一代码库 "depot" 中的 //tvix 目录下开发。代码审查在 Gerrit 上进行,bug 报告在我们的问题追踪系统中提交。
如果想了解更多关于 Tvix 的信息,欢迎联系我们。我们希望有人能帮助我们审查设计、集思广益并描述我们可能尚未考虑到的需求。
大部分开发讨论都在我们专门的 IRC 频道 #tvix-dev
(hackint 网络)中进行。该频道也可以通过 XMPP 在 #tvix-dev@irc.hackint.org
(注意!)或通过 Matrix 在 #tvix-dev:hackint.org
访问。
此外,还有更广泛的 TVL 社区 IRC 频道,讨论的话题可能不那么集中,或者你也可以加入我们的邮件列表。
警告:Tvix 尚未准备好在生产环境中使用。我们当前的任何 API 都不应被视为稳定。
警告:本项目或仓库的任何其他实例都是 josh
-镜像。我们不接受在上述工具和通信方法之外的代码贡献或问题报告。
组件
该文件夹包含以下组件:
//tvix/castore
- 以内容寻址方式进行子树存储/传输//tvix/cli
- Tvix 的初步 REPL 和命令行界面实现//tvix/eval
- Nix 编程语言的实现//tvix/nar-bridge
- 在 tvix-store 前提供 Nix HTTP 二进制缓存接口的 HTTP 网络服务器//tvix/nix-compat
- 用于与 C++ Nix 兼容的 Rust 库,包括编码、哈希方案和格式等功能//tvix/serde
- 用于将 Nix 语言用于应用程序配置的 Rust 库//tvix/store
- 将 Nix 存储路径和元数据与内容寻址层连接的"文件系统"
还有一些包含辅助内容的其他文件夹,您可以自行探索。
构建命令行界面
只要您处于具有正确依赖项的 shell 环境中,也可以使用标准 Rust 工具(即 cargo build
)构建命令行界面。
- 如果您克隆了完整的单一代码库,可以通过
mg shell //tvix:shell
提供该环境。 - 如果您只克隆了
tvix
工作区(git clone https://code.tvl.fyi/depot.git:workspace=views/tvix.git
),nix-shell
可以提供该环境。
如果您在 TVL 单一代码库中,还可以运行 mg build //tvix/cli
(或在该文件夹内运行 mg build
)以进行更加增量的构建。
请按照整个代码库的说明获取 mg
并使用代码库工具。
兼容性
重要说明: 我们只使用并测试我们的软件在 Nix 2.3 版本下的 Nix 构建。较新的 Nix 版本存在各种 bug 和细微问题,我们没有能力解决这些问题,在较新的 Nix 版本中构建可能有效,也可能无效。
Rust 项目,crate2nix
Tvix 的某些部分是用 Rust 编写的。为了简化 Nix 端的依赖管理,我们在 //tvix
中的单个 Rust 工作区中使用 crate2nix
来维护 Nix 构建配置。
在 //tvix
下的任何 Rust 项目中更改 Cargo 依赖配置时,请确保在 //tvix
目录中运行 mg run //tools:crate2nix-generate
,并提交生成的 Cargo.nix
文件的更改。这仅适用于完整的 TVL 检出。
在为 crate 添加/删除 Cargo 功能时,您需要将其添加到在 CI 中测试的功能幂集中。对于每个 crate,都有一个包含 mkFeaturePowerset
调用的 default.nix 文件,修改列表以包含/删除该功能。请注意,您不需要添加"集合"功能,如 tvix-[ca]store 的 fs
或 default
。
许可结构
为 Tvix 实现的所有代码均采用 GPL-3.0 许可,但用于服务间通信的协议缓冲区定义除外,这些定义采用更宽松的许可(MIT)。
这种结构的理念是,任何直接使用我们代码的行为(例如链接到它、嵌入评估器等)都将受 GPL3 条款的约束,但用户可以根据 MIT 许可条款自由实现自己的组件来使用这些协议。