省流直接说,使用cargo-run-bin
类似于你在package.json里写scripts,然后npm run
背景
为什么要在nodejs里去做调用cargo库这种操作呢?
那就要从changelog开始讲起了,也就是更新日志。按照keepachangelog的规范进行书写更新日志,我有一个功能就是根据指定版本号(比如1.1.1)找到对应的描述内容
# Changelog
## [1.1.1] - 2023-03-05
### Added
- Arabic translation (#444).
## [1.1.0] - 2019-02-15
### Added
- Danish translation (#297).
但我在npm找了一圈都是运行nodejs环境下的库,因为我的应用是tauri(js+rust),于是我将目光转向cargo,顺利找到了parse-changelog
我在后续发布版本的时候遇到了一个问题,如果我在写这个版本的更新日志时写错了,发布后出现解析不了,看不到日志该怎么办?
于是我只能在发布前,对更新日志的内容进行校验,但手动检查也太麻烦了,于是便有了如标题所说的需求
方案
在Cargo.toml以一下格式添加第三方库
使用cargo bin CRATE的形式即可在src-tauri目录下进行调用
使用的parse-changelog也能以cli形式进行调用
# src-tauri/Cargo.toml
[package.metadata.bin]
parse-changelog = { version = "^0.6" }
使用execa进行命令的调用
// scripts/release.js
const run = (bin, args, opts = {}) =>
execa(bin, args, { stdio: 'inherit', ...opts })
const base = p => path.join(path.dirname(fileURLToPath(import.meta.url)), p)
async function checkChangelog(version) {
const dir = base('../changelog')
const list = await fs.readdir(dir)
for (const name of list) {
await run('cargo', ['bin', 'parse-changelog', '-t', path.join(dir, name), version], {
cwd: base('../src-tauri'),
})
}
}
结尾
这样就完成了,一个cargo库同时用在了开发和生产环境上🎉
具体release文件,见这里