3 个版本 (重大变更)

0.12.0 2024年2月9日
0.11.0 2024年1月19日
0.10.0 2023年10月17日

#1449 in 解析器实现

Download history 183/week @ 2024-04-20 170/week @ 2024-04-27 159/week @ 2024-05-04 165/week @ 2024-05-11 194/week @ 2024-05-18 101/week @ 2024-05-25 273/week @ 2024-06-01 462/week @ 2024-06-08 1361/week @ 2024-06-15 1569/week @ 2024-06-22 804/week @ 2024-06-29 1502/week @ 2024-07-06 1505/week @ 2024-07-13 1703/week @ 2024-07-20 1723/week @ 2024-07-27 1616/week @ 2024-08-03

每月下载 6,915 次
starlark_bin 中使用

Apache-2.0

3MB
69K SLoC

Rust 中的 Starlark

Support Ukraine GitHub link crates.io version docs.rs availability Build status

GitHub 上有多个此仓库的副本,facebookexperimental/starlark-rust 是官方的一个。

本项目提供了 Starlark 语言(原名 Skylark)的 Rust 实现。Starlark 是一种受 Python3 启发的确定性语言,用于构建系统(如 Bazel、Buck 和 Buck2)中的配置,其中 Buck2 依赖于这个库。该项目最初在这个仓库中开发 (此处),其中包含更详细的历史记录。

至少有三个 Starlark 的实现,一个是 Java 中的 实现,一个是 Go 中的 实现,以及这个 Rust 中的实现。我们主要遵循 Starlark 标准。如果您想尝试 Rust Starlark,可以克隆此仓库并运行

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ cargo run
$> 1+2
3

本项目由 Damien Martin-Guillerez 开始。该库的 0.4.0 版本将所有权从 Google 转移到 Facebook。

了解更多

阅读 这篇博客文章 了解库的概述、Starlark 的原因以及它如何适合您的项目。还有 2 分钟的介绍视频

特性

本项目具有以下特性

  • Rust 类型与 Starlark 之间的易用互操作性。
  • 适合Rust的类型,因此冻结值是Send/Sync,而非冻结值则不是。
  • 垃圾回收的值上分配,这些值位于堆上
  • 可选的运行时检查类型
  • 用于检测Starlark中代码问题的代码检查器
  • LSP形式实现的IDE集成。
  • 广泛的测试,包括模糊测试
  • 支持DAP

本项目还有三个非目标

  • 我们不旨在发布之间的API稳定性,更愿意快速迭代并尽可能完善API。但我们遵循SemVer
  • 我们不旨在最小化依赖关系,更愿意保持一个功能强大的包。但如果某些依赖关系证明很棘手,我们可能会添加功能标志。

组件

共有六个组件

  • starlark_derive,这是一个过程宏crate,用于定义Starlark所需的宏。这个库是starlark库的依赖,它重新导出所有相关部分,不应直接使用。
  • starlark_map,这是一个具有内存高效的有序/无序映射/集合以及各种其他在Starlark中很有用的数据结构的库。
  • starlark_syntax,这是一个具有Starlark AST和解析函数的库。只有当你想直接操作AST时才使用。
  • starlark是主库,包含评估器、标准库、调试器支持以及许多其他部分。希望将Starlark嵌入其环境的(带有额外类型、库函数和功能)项目将使用此库。此库导出了starlark_derivestarlark_map和大多数starlark_syntax的相关部分。
  • starlark_lsp,这是一个提供LSP的库。
  • starlark_bin,这是一个二进制文件,提供了交互式评估、IDE功能和代码检查器,通过命令行公开。如果你想要使用纯Starlark(但如果你这样做,请考虑Python3)或将其作为实验的平台,这很有用。大多数项目最终会在starlarkstarlark_lsp库的基础上实现一些功能,并整合特定的额外类型等。

特别是starlark_bin二进制文件可以有效地用作代码检查器。但对于REPL、评估器和IDE功能,starlark_bin二进制文件只知道标准Starlark。大多数Starlark嵌入提供了额外的函数和数据类型,以处理特定领域的问题,如果使用这些绑定,将会导致REPL/评估器失败,并给出较差的IDE体验。在大多数情况下,你应该编写自己的二进制文件,依赖于starlark库,整合你特定的领域部分,然后使用捆绑的LSP函数在你的基础上产生自己的IDE/REPL/评估器。你应该仍然能够使用VS Code扩展

兼容性

在本节中,我们概述了我们不遵守Starlark规范的地方。

  • 我们有很多扩展,例如类型注解、递归、顶级for
  • 我们目前还不支持对 Starlark 的后续添加,例如 bytes
  • 在某些情况下,创建循环数据结构可能会导致栈溢出。

发布版本

  1. 检查 GitHub Actions 是否为绿色。
  2. 使用自上次发布以来的更改更新 CHANGELOG.md。此链接可以帮助您(更新为与上次发布进行比较)。
  3. 更新两个 Cargo.toml 文件中的版本号。如果没有不兼容的更改,则增加 0.0.1,如果有,则增加 0.1.0。将 starlark 中的依赖项升级到指向最新的 starlark_derive 版本。
  4. 将文件 CHANGELOG.mdLICENSEREADME.md 复制到每个子目录中。
  5. 在每个组件目录中运行 cargo publish --allow-dirty --dry-run,然后在没有 --dry-run 的情况下运行,如上所述的顺序。
  6. 使用 v0.X.Y 创建一个 GitHub release,使用 starlark 版本作为名称。

许可证

Starlark Rust 使用 Apache License,版本 2.0 许可,如 LICENSE 文件中所述。

依赖项

~10–15MB
~249K SLoC