安装 Beancount(C++ 版本)

Martin Blais - 2020 年 7 月

http://furius.ca/beancount/doc/v3-install

在您的计算机上下载并运行 Beancount v3(开发中版本)的说明。如需安装 v2 版本,请参阅此文档:Beancount - 安装(v2)

本文介绍的是 Beancount v3,这是一个实验性的开发版本(截至 2020 年 7 月);有关稳定版本(Beancount v2)的构建说明,请参阅另一份文档

设置 Python

运行程序仍需 Python 依赖项。

pip install –r requirements/dev.txt

使用 Bazel 构建

警告:这是一个实验性的开发分支,不要期望所有功能都完美无缺。

Bazel 依赖项

Beancount v3 使用 Bazel 构建系统,该系统在很大程度上使您无需关心本地安装和计算机上的依赖项。

需要安装的依赖项包括:

  • Bazel 本身。 请遵循 https://bazel.build/ 上的说明

  • C++ 编译器。 g++ 或 clang 均可使用,我使用的是 clang-11。

  • Python 运行时(版本 3.8 或更高)。请从您的发行版中安装。

Bazel 将自行下载并编译其所需的所有库(包括代码生成器,例如 Bison),并以构建文件中指定的确切版本进行构建,因此您无需担心这些依赖项。

构建与测试

只需运行以下命令:

bazel build //bin:all

目前没有安装脚本,您必须从源码运行。您可以使用以下命令运行单个程序(例如 bean-check):

bazel run //bin:bean_check -- /path/to/ledger.beancount

或者,如果您不关心自动重建修改过的代码,可以这样运行:

 ./bazel-bin/bin/bean_check /path/to/ledger.beancount

开发

您可以这样运行所有单元测试:

bazel test //...

由于 Bazel 详细记录了所有依赖项,修改代码后重新运行此命令只会重新测试受影响的目标;这使得带有测试的迭代开发更加有趣。

另一个优势是,由于构建所依赖的所有库都会被下载和构建,虽然首次构建可能较慢,但我们可以使用我们所依赖代码的最新版本。

目标在各自目录的 BUILD 文件中定义。所有构建规则均可在 //third_party 下找到。

数据导入

数据导入代码涉及导入位于仓库外部的代码。Bazel 二进制文件是自包含的,若未将模块声明为依赖项,则无法导入,因此运行 //bin:bean_extract 目标可能无法正常工作。

目前这还不可行(除非将你的导入配置构建为一个显式链接 Beancount 的 py_binary() 目标)。通过定义一个从外部获取规则的合适 WORKSPACE 文件,无需编写大量 Bazel 代码即可实现。我尚未提供此示例(待定)。

作为变通方案,你可以将 PYTHONPATH 设置为从源码位置导入,并提前创建指向解析器 .so 文件的符号链接。你可以这样操作:

make bazel-link

待定

还有一些构建集成任务待完成:

  • 尚未支持 pytype。

  • pylint 也未集成到构建流程中。

使用 meson 进行开发安装

注意:本节内容基于以下讨论更新:https://groups.google.com/g/beancount/c/7ppbyz_5B5w

Beancount v3 的 Bazel 构建包含一些实验性 C++ 代码,截至撰写时(2024 年 3 月 9 日),这些代码仅用于技术演示。在“生产”环境中,v3 使用 meson-python 构建扩展模块并打包为 Python wheel,这正是 pip 安装时所使用的机制。

本节描述的是为开发 Beancount v3 Python 代码而进行的安装流程,而非用于实验 C++ 代码。

在 Linux 上

已在 Ubuntu 上使用 Python 3.12 测试通过

相关链接

https://mesonbuild.com/meson-python/how-to-guides/editable-installs.html

git clone https://github.com/beancount/beancount.git

创建并激活虚拟环境

python3.12 -m venv beancount/venv
. beancount/venv/bin/activate
cd beancount

安装所需包。

python -m pip install meson-python meson ninja

以可编辑模式安装 Beancount,并禁用构建隔离

python -m pip install --no-build-isolation --editable .

注意:观点认为无需使用 --no-build-isolation 选项,但也有人提到不使用该选项时安装会失败。此外,文档建议需要此选项。具体是否需要可能取决于 Linux 环境类型。

安装 pytest

python -m pip install pytest

运行测试,确保一切正常:

pytest --import-mode=importlib beancount/

在 Windows 上

已在 64 位 Windows 10 专业版上测试通过

前提条件

安装 Microsoft Visual Studio(已测试版本 2022)

操作步骤

git clone https://github.com/beancount/beancount.git
cd beancount

若运行的是 x64 位 Windows,请启动 "x64 原生工具命令提示符(VS 20XX)"。方法为:按下并释放 Windows 键,然后输入 x64

打开此提示

进入 beancount 的安装目录

C:\Program Files\Microsoft Visual Studio\2022\Community>cd C:\_code\t\beancount
C:\_code\t\beancount>

激活虚拟环境

C:\_code\t\beancount>venv\Scripts\Activate
(venv) C:\_code\t\beancount>

安装所需包

(venv) C:\_code\t\beancount>py -m pip install meson-python meson ninja

以可编辑模式安装 beancount。与 Linux 不同,Windows 上的 --no-build-isolation 一方面会引发一些错误,但另一方面似乎并不必要

(venv) C:\_code\t\beancount> py -m pip install --editable .

安装 pytest

(venv) C:\_code\t\beancount>py -m pip install pytest

运行测试

(venv) C:\_code\t\beancount>pytest --import-mode=importlib beancount

注意:Windows 上的部分测试会失败,但这是由于一般的可移植性问题