openlang

集成测试怎样执行工作区里另一个 crate 的二进制文件?

在有多个 crate 的工作区里,怎样让一个 crate 的集成测试依赖并运行另一个 crate 的可执行目标,而不是它的库目标?

工作区结构如下。

workspace/
├── rillmere_probe/
│   └── tests/check.rs
└── rillmere_exec/
    ├── src/lib.rs
    └── src/main.rs

rillmere_probe crate 把 rillmere_exec 列为 dev-dependency。它的测试还需要启动 rillmere_exec 的二进制文件。以前这样可以正常工作。但 rust-nightly 的 build-layout-v2 改变了文件布局,导致 assert_cmd-2.1.3 找不到 rillmere_exec 的可执行目标。assert_cmd-2.2.2 的诊断信息更明确,是 CARGO_BIN_EXE_rillmere_exec is unset。看到这个,我开始怀疑 assert_cmd 到底支不支持这种情况。应该不只我一个人遇到过吧。有人找到解决办法了吗?

从英语翻译查看原文

后续讨论 4

顺着彼此的依据读下去
  1. 固定链接

    恐怕只能选这些办法

    -

    尽量把 main.rs 中的代码移到 lib.rs,据我所知,正式项目通常已经这样做了。让 main.rs 只负责调用。甚至可以让 main.rs 只剩一行调用 :v,这样其他项目更容易使用这些代码

    -

    手动测试,先构建可执行文件,再运行它,然后通过 std::command 读取错误

    从英语翻译查看原文
  2. 固定链接

    哦,太好了!这正是我需要的功能。只有这个集成测试要求 nightly,我可以接受。不过我还是希望 crate 的其他部分能用稳定版 Rust 编译。接下来就要想办法在稳定版编译器下跳过这个测试。可能得把整个测试放进独立的 crate。虽然不理想,但也能用。我更喜欢这个办法,而不是把二进制文件里的内容全搬到库里。

    从英语翻译查看原文
  3. 固定链接

    只有这个集成测试要求 nightly,我可以接受

    artifact dependencies 是 cargo 的不稳定功能,而不是 rustc 编译器的。

    遗憾的是,cargo 清单没有类似条件编译标志的机制,所以无法只为一个集成测试开启这项不稳定功能,同时让包里的其他 crate 继续兼容稳定版 cargo,因为稳定版 cargo 连这种清单都无法读取。

    因此,要用 artifact dependencies,就得把集成测试 crate 放进独立的包,准确说是独立的工作区,让它拥有与其他包分开的 Cargo.toml。

    从英语翻译查看原文

同一个问题的其他角度

  1. 减少 docker-compose 的控制台输出

    在开发环境里用 docker-compose up 启动所有服务时,我的几个容器会输出几百行又几百行内容。有没有方便的办法过滤这些输出,或者更好一些,让这些服务在 docker-compose up 运行时不要写到标准输出?

    回复 3最近活动 bash
  2. 能否用 D 代替 C 编写 Python 扩展模块?

    看来 D 能与 C 链接。我想用 D 编写 Python 扩展模块。我是不是漏掉了什么原因,导致这种方法根本无法运行?

    回复 2最近活动 d
  3. 通过 Nix 声明 Micro 插件?🤔

    python 可以这样写。 Python.withPackages (q: with q; [ fastapi ]) Micro 编辑器有类似的机制吗? 能不能把 micro 编辑器的软件包和插件一起指定?:thinking: 那样会方便很多。

    回复 3最近活动 nix