使用 napi-rs 搭建开发环境
4/20/2023, 4:49:00 PM#Napi-RS#Rust
AI Summary
napi-rs 提供了方便的命令来让我们基于 Rust 开发 node 的 addon,farm 也是基于 napi-rs 开发的。本小节记录了 napi-rs 的搭建过程,并添加了调试命令以增强调试体验。详细流程包括初始化项目、使用 pnpm + cargo 将原有项目改造成 monorepo 项目,添加相应的包,生成 binding 文件,以及添加调试功能。最终完成了环境搭建。
napi-rs
https://napi.rs/docs/introduction/getting-started 提供了方便的命令来让我们基于 Rust 开发 node 的 addon,farm 也是基于 napi-rs 开发的,本小节记录 napi-rs 搭建过程,并且添加调试命令 增强调试体验。 详细流程
- 初始化项目 https://napi.rs/docs/introduction/getting-started 根据官网步骤初始化项目目录
- 使用 pnpm + cargo 将原有项目改造成 monorepo 项目 a. 将原来的 yarn 文件删除 创建 pnpm-workspakce.yaml 然后执行 pnpm install b. 将原来的 rust 项目也改造成 monorepo 的形式 具体配置文件如下
_10# pnpm-workspace.yaml_10packages:_10 - packages/*_10 - examples/*_10 - crates/*
_12<!-- Cargo.toml -->_12[workspace]_12members = ["crates/*"]_12resolver = "2"_12_12[workspace.dependencies]_12napi = {version = "2.15.0", default-features = false, features = [_12 "napi4",_12 "error_anyhow",_12 "serde-json",_12]}_12napi-derive = "2.15.0"
- 添加相应的包
_10cli_10 ├── Cargo.toml_10 ├── build.rs_10 └── src_10 └── lib.rs
具体文件内容
_21# Cargo.toml_21[package]_21edition = "2021"_21name = "farm_cli"_21version = "0.1.0"_21_21# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html_21_21[lib]_21crate-type = ["cdylib"]_21_21[dependencies]_21napi = {workspace = true}_21napi-derive = {workspace = true}_21_21[build-dependencies]_21napi-build = "2.0.1"_21_21[profile.release]_21lto = true_21strip = "symbols"
build.rs
_14use napi_build::setup;_14_14fn main() {_14 setup()_14}_14#![deny(clippy::all)]_14_14#[macro_use]_14extern crate napi_derive;_14_14#[napi]_14pub fn sum(a: i32, b: i32) -> i32 {_14 a + b_14}
- packages 文件目录
_10cli_10 ├── binding_10 │ ├── binding.cjs_10 │ ├── binding.d.ts_10 │ └── index.darwin-arm64.node_10 ├── package.json_10 └── src_10 └── index.js
如何生成 binding 文件
Note添加如下的命令
_10"build:rs:debug": "napi build --platform --cargo-name farm_cli -p farm_cli --cargo-cwd ../../ binding --js binding.cjs --dts binding.d.ts"
index.cjs
_10const { sum } = require('../binding/binding.cjs');_10const total = sum(1, 2);_10console.log(total);
测试执行 输出没有问题
_103
添加调试 .vscode 下面添加
launch.json
_14{_14 "version": "0.2.0",_14 "configurations": [_14 {_14 "type": "lldb",_14 "request": "launch",_14 "sourceLanguages": ["rust"],_14 "name": "debug rust",_14 "program": "node",_14 "preLaunchTask": "npm: build:debug",_14 "args": ["--inspect", "${file}"]_14 }_14 ]_14}
tasks.json
_12{_12 "version": "2.0.0",_12 "tasks": [_12 {_12 "type": "npm",_12 "script": "build:dev",_12 "group": "build",_12 "problemMatcher": [],_12 "label": "npm: build:debug"_12 }_12 ]_12}
到此环境搭建完毕 代码地址 https://github.com/Maidang1/rust-learn-code/commit/51f5d71cdf9c6a3aa691057523e9145a9bde81af
作者:Madinah