refactor: move server rs workspace entries into crates

This commit is contained in:
2026-04-21 11:01:25 +08:00
parent 5a60ab3972
commit f6bf5f665e
47 changed files with 244 additions and 233 deletions

View File

@@ -1,13 +1,13 @@
# 当前阶段先建立虚拟 workspace。
# 后续按“主工程 apps + 独立模块 packages”模式逐项补充 members。
# 后续按“主工程 crate + 独立模块 crate”模式逐项补充 members。
[workspace]
resolver = "2"
members = [
"apps/api-server",
"crates/api-server",
]
[workspace.package]
edition = "2021"
edition = "2024"
version = "0.1.0"
license = "UNLICENSED"

View File

@@ -17,29 +17,29 @@
当前目录已经完成以下三十四项初始化:
1. 为新后端预留正式目录并把路径固定到仓库结构中。
2. 创建虚拟 workspace `Cargo.toml`,后续 package 会逐项挂入。
3. 明确内部采用“`apps/*` 主工程 + `packages/*` 独立模块包”的多 package 组织方式。
4. 创建 `apps/api-server/` 目录占位,固定 Axum 主工程落位。
5. 创建 `apps/spacetime-module/` 目录占位,固定 SpacetimeDB 主工程落位。
6. 创建 `packages/module-auth/` 目录占位,固定鉴权模块 package 落位。
7. 创建 `packages/module-runtime/` 目录占位,固定运行时状态基座模块 package 落位。
8. 创建 `packages/module-story/` 目录占位,固定故事主循环模块 package 落位。
9. 创建 `packages/module-combat/` 目录占位,固定战斗规则模块 package 落位。
10. 创建 `packages/module-inventory/` 目录占位,固定背包与物品变更模块 package 落位。
11. 创建 `packages/module-npc/` 目录占位,固定 NPC 状态与互动模块 package 落位。
12. 创建 `packages/module-progression/` 目录占位,固定成长与章节推进模块 package 落位。
13. 创建 `packages/module-quest/` 目录占位,固定任务运行时模块 package 落位。
14. 创建 `packages/module-runtime-item/` 目录占位,固定运行时物品模块 package 落位。
15. 创建 `packages/module-custom-world/` 目录占位,固定自定义世界与 agent 模块 package 落位。
16. 创建 `packages/module-assets/` 目录占位,固定资产任务与对象绑定模块 package 落位。
17. 创建 `packages/module-ai/` 目录占位,固定 AI 编排模块 package 落位。
18. 创建 `packages/shared-contracts/` 目录占位,固定前后端兼容 contract 共享 package 落位。
19. 创建 `packages/shared-kernel/` 目录占位,固定跨模块共享领域内核 package 落位。
20. 创建 `packages/platform-auth/` 目录占位,固定鉴权平台适配 package 落位。
21. 创建 `packages/platform-oss/` 目录占位,固定 OSS 平台适配 package 落位。
22. 创建 `packages/platform-llm/` 目录占位,固定大模型平台适配 package 落位。
23. 创建 `packages/spacetime-client/` 目录占位,固定 SpacetimeDB 客户端适配 package 落位。
24. 创建 `packages/tests-support/` 目录占位,固定测试支撑共享 package 落位。
2. 创建虚拟 workspace `Cargo.toml`,后续 crate 会逐项挂入。
3. 明确内部采用“`crates/*` 统一承载主工程 crate 与独立模块 crate”的多 crate 组织方式。
4. 创建 `crates/api-server/` 目录占位,固定 Axum 主工程 crate 落位。
5. 创建 `crates/spacetime-module/` 目录占位,固定 SpacetimeDB 主工程 crate 落位。
6. 创建 `crates/module-auth/` 目录占位,固定鉴权模块 crate 落位。
7. 创建 `crates/module-runtime/` 目录占位,固定运行时状态基座模块 crate 落位。
8. 创建 `crates/module-story/` 目录占位,固定故事主循环模块 crate 落位。
9. 创建 `crates/module-combat/` 目录占位,固定战斗规则模块 crate 落位。
10. 创建 `crates/module-inventory/` 目录占位,固定背包与物品变更模块 crate 落位。
11. 创建 `crates/module-npc/` 目录占位,固定 NPC 状态与互动模块 crate 落位。
12. 创建 `crates/module-progression/` 目录占位,固定成长与章节推进模块 crate 落位。
13. 创建 `crates/module-quest/` 目录占位,固定任务运行时模块 crate 落位。
14. 创建 `crates/module-runtime-item/` 目录占位,固定运行时物品模块 crate 落位。
15. 创建 `crates/module-custom-world/` 目录占位,固定自定义世界与 agent 模块 crate 落位。
16. 创建 `crates/module-assets/` 目录占位,固定资产任务与对象绑定模块 crate 落位。
17. 创建 `crates/module-ai/` 目录占位,固定 AI 编排模块 crate 落位。
18. 创建 `crates/shared-contracts/` 目录占位,固定前后端兼容 contract 共享 crate 落位。
19. 创建 `crates/shared-kernel/` 目录占位,固定跨模块共享领域内核 crate 落位。
20. 创建 `crates/platform-auth/` 目录占位,固定鉴权平台适配 crate 落位。
21. 创建 `crates/platform-oss/` 目录占位,固定 OSS 平台适配 crate 落位。
22. 创建 `crates/platform-llm/` 目录占位,固定大模型平台适配 crate 落位。
23. 创建 `crates/spacetime-client/` 目录占位,固定 SpacetimeDB 客户端适配 crate 落位。
24. 创建 `crates/tests-support/` 目录占位,固定测试支撑共享 crate 落位。
25. 创建 `scripts/dev.ps1`,固定 Windows 本地开发入口。
26. 创建 `scripts/dev.sh`,固定 Unix-like 本地开发入口。
27. 创建 `scripts/test.ps1`,固定 Windows 本地测试入口。
@@ -53,7 +53,7 @@
后续任务会继续在本目录内按顺序补齐:
1. `apps/spacetime-module` 的表、reducer、view 聚合入口
1. `crates/spacetime-module` 的表、reducer、view 聚合入口
2. `module-auth` 的身份表、JWT 与 refresh cookie 主链
## 3. 已冻结边界
@@ -62,9 +62,9 @@
1. 迁移期保留 `server-node/`,不提前删除。
2. 前端在 `M0 ~ M6` 期间只访问 Axum不直连 SpacetimeDB。
3. 外部副作用统一收口在 Axum / package 内应用层 / infra。
4. `apps/api-server` 只组合与暴露协议,不直接吞并业务模块实现。
5. `apps/spacetime-module` 只负责汇总各模块 package 的表、reducer、view。
3. 外部副作用统一收口在 Axum / crate 内应用层 / infra。
4. `crates/api-server` 只组合与暴露协议,不直接吞并业务模块实现。
5. `crates/spacetime-module` 只负责汇总各模块 crate 的表、reducer、view。
## 4. 关联文档

View File

@@ -1,10 +1,10 @@
# api-server 主工程 package 占位说明
# api-server 主工程 crate 占位说明
日期:`2026-04-20`
## 1. package 职责
## 1. crate 职责
`api-server` 是新后端的 Axum 主工程 package后续负责
`api-server` 是新后端的 Axum 主工程 crate后续负责
1. `main.rs` 启动入口
2. `Router` 装配
@@ -29,7 +29,7 @@
7. `src/logging.rs`
8. 基础 `TraceLayer` 挂载与 `tracing subscriber` 初始化
后续与本 package 直接相关的任务包括:
后续与本 crate 直接相关的任务包括:
1. [x] 接入统一日志与 tracing
2. [x] 接入 `request_id`
@@ -78,9 +78,9 @@
当前本地检查链路约定:
1. `../../scripts/check.ps1``../../scripts/check.sh` 统一串联 `cargo fmt --all --check``cargo clippy``cargo check``cargo test`
2. 默认检查整个 `server-rs` workspace确保后续多 package 扩容时仍然保持统一口径。
3. 当只需聚焦单个 package 时,可通过 `-Package``SERVER_RS_CHECK_PACKAGE` 收窄 `clippy / check / test` 目标。
4. `cargo fmt --all --check` 仍固定覆盖整个 workspace避免多 package 下格式基线漂移。
2. 默认检查整个 `server-rs` workspace确保后续多 crate 扩容时仍然保持统一口径。
3. 当只需聚焦单个 crate 时,可通过 `-Package``SERVER_RS_CHECK_PACKAGE` 收窄 `clippy / check / test` 目标。
4. `cargo fmt --all --check` 仍固定覆盖整个 workspace避免多 crate 下格式基线漂移。
当前本地 smoke 链路约定:
@@ -91,6 +91,6 @@
## 3. 边界约束
1. `api-server` 负责 HTTP、SSE、Cookie、Header、路由与协议装配。
2. 业务逻辑优先通过独立模块 package 暴露能力,再由主工程组合。
3. 外部副作用通过 `platform-auth``platform-oss``platform-llm` 与各模块 package 的应用层完成。
2. 业务逻辑优先通过独立模块 crate 暴露能力,再由主工程组合。
3. 外部副作用通过 `platform-auth``platform-oss``platform-llm` 与各模块 crate 的应用层完成。
4. 不把领域规则直接堆在 handler 中。

View File

@@ -1,21 +1,21 @@
# module-auth 独立模块 package 占位说明
# module-auth 独立模块 crate 占位说明
日期:`2026-04-20`
## 1. package 职责
## 1. crate 职责
`module-auth` 是鉴权与会话模块 package后续负责
`module-auth` 是鉴权与会话模块 crate后续负责
1. 用户身份、会话、风控、审计相关领域模型
2. 手机验证码、微信登录、密码登录的模块内用例编排
3. 与 `apps/api-server` 的鉴权接口装配对接
4. 与 `apps/spacetime-module` 的身份表、会话表聚合对接
3. 与 `crates/api-server` 的鉴权接口装配对接
4. 与 `crates/spacetime-module` 的身份表、会话表聚合对接
## 2. 当前阶段说明
当前阶段已冻结前六张鉴权基础表设计,剩余 `wechat_auth_state` 与 token 细节仍按顺序继续展开。
后续与本 package 直接相关的任务包括:
后续与本 crate 直接相关的任务包括:
1. 设计 `user_account``auth_identity``refresh_session`
2. 设计 `auth_audit_log``auth_risk_block`
@@ -34,5 +34,5 @@
## 3. 边界约束
1. `module-auth` 负责鉴权领域规则与模块级编排,不直接把供应商 SDK 逻辑写进主工程。
2. 短信、微信、JWT、Cookie 等平台适配优先通过 `packages/platform-auth` 承接。
3. 身份与会话状态最终由 `apps/spacetime-module` 聚合,前端接口由 `apps/api-server` 暴露。
2. 短信、微信、JWT、Cookie 等平台适配优先通过 `crates/platform-auth` 承接。
3. 身份与会话状态最终由 `crates/spacetime-module` 聚合,前端接口由 `crates/api-server` 暴露。

View File

@@ -1,14 +1,14 @@
# spacetime-module 主工程 package 占位说明
# spacetime-module 主工程 crate 占位说明
日期:`2026-04-20`
## 1. package 职责
## 1. crate 职责
`spacetime-module` 是新后端的 SpacetimeDB 主工程 package后续负责
`spacetime-module` 是新后端的 SpacetimeDB 主工程 crate后续负责
1. 聚合各独立模块 package 的表定义
2. 聚合各独立模块 package 的 reducer
3. 聚合各独立模块 package 的 view / 读模型
1. 聚合各独立模块 crate 的表定义
2. 聚合各独立模块 crate 的 reducer
3. 聚合各独立模块 crate 的 view / 读模型
4. 生成可发布的 SpacetimeDB wasm 模块
5. 由 `../../scripts/spacetime-dev.ps1``../../scripts/spacetime-dev.sh` 驱动的本地 standalone 启动链路
@@ -16,7 +16,7 @@
当前阶段仍未进入具体 schema 与 reducer 实现,但已经补齐本地 standalone 启动脚本,先把 SpacetimeDB 进程入口固定下来。
后续与本 package 直接相关的任务包括:
后续与本 crate 直接相关的任务包括:
1. 建立模块聚合入口
2. 设计表、reducer、view 的聚合方式
@@ -28,10 +28,10 @@
1. `../../scripts/spacetime-dev.ps1``../../scripts/spacetime-dev.sh` 当前固定执行 `spacetime start` 的 standalone 模式。
2. 默认监听 `127.0.0.1:3001`,避免与 `api-server` 默认 `3000` 端口冲突。
3. 本地数据目录固定到 `server-rs/.spacetimedb/local`,避免污染全局 SpacetimeDB 根目录。
4. 当前阶段暂不自动 publish `apps/spacetime-module`,待 module 实体 scaffold 与聚合入口落地后再扩展。
4. 当前阶段暂不自动 publish `crates/spacetime-module`,待 module 实体 scaffold 与聚合入口落地后再扩展。
## 3. 边界约束
1. `spacetime-module` 只聚合状态模型,不直接承接 HTTP、Cookie、Header、OSS、短信、微信、LLM 等外部副作用。
2. 每个业务模块优先在自己的 `packages/module-*` 中定义状态与规则,再由主工程聚合。
2. 每个业务模块优先在自己的 `crates/module-*` 中定义状态与规则,再由主工程聚合。
3. 主工程不重新吞并各模块实现细节,避免回到单大包结构。

View File

@@ -2,7 +2,8 @@
param(
[Alias("h")]
[switch]$Help,
[string]$Package = ""
[Alias("Package")]
[string]$Crate = ""
)
$ErrorActionPreference = "Stop"
@@ -11,12 +12,12 @@ function Write-Usage {
@(
'Usage:'
' ./server-rs/scripts/check.ps1'
' ./server-rs/scripts/check.ps1 -Package api-server'
' ./server-rs/scripts/check.ps1 -Crate api-server'
''
'Notes:'
' 1. Run cargo fmt --all --check for the whole server-rs workspace'
' 2. Run clippy/check/test for the whole workspace by default'
' 3. Use -Package to target one workspace package for clippy/check/test'
' 3. Use -Crate to target one workspace crate for clippy/check/test'
) -join [Environment]::NewLine
}
@@ -40,7 +41,7 @@ Push-Location $serverRsDir
try {
cargo fmt --all --check --manifest-path $manifestPath
if ([string]::IsNullOrWhiteSpace($Package)) {
if ([string]::IsNullOrWhiteSpace($Crate)) {
Write-Host "[server-rs:check] step: cargo clippy --workspace --all-targets --all-features -D warnings"
cargo clippy --workspace --manifest-path $manifestPath --all-targets --all-features -- -D warnings
@@ -51,15 +52,15 @@ try {
cargo test --workspace --manifest-path $manifestPath
}
else {
Write-Host "[server-rs:check] target package: $Package"
Write-Host "[server-rs:check] step: cargo clippy -p $Package --all-targets --all-features -D warnings"
cargo clippy -p $Package --manifest-path $manifestPath --all-targets --all-features -- -D warnings
Write-Host "[server-rs:check] target crate: $Crate"
Write-Host "[server-rs:check] step: cargo clippy -p $Crate --all-targets --all-features -D warnings"
cargo clippy -p $Crate --manifest-path $manifestPath --all-targets --all-features -- -D warnings
Write-Host "[server-rs:check] step: cargo check -p $Package"
cargo check -p $Package --manifest-path $manifestPath
Write-Host "[server-rs:check] step: cargo check -p $Crate"
cargo check -p $Crate --manifest-path $manifestPath
Write-Host "[server-rs:check] step: cargo test -p $Package"
cargo test -p $Package --manifest-path $manifestPath
Write-Host "[server-rs:check] step: cargo test -p $Crate"
cargo test -p $Crate --manifest-path $manifestPath
}
}
finally {

View File

@@ -8,13 +8,13 @@ usage() {
cat <<'EOF'
用法:
./server-rs/scripts/check.sh
SERVER_RS_CHECK_PACKAGE=api-server ./server-rs/scripts/check.sh
SERVER_RS_CHECK_CRATE=api-server ./server-rs/scripts/check.sh
说明:
1. 先执行整个 `server-rs` workspace 的 `cargo fmt --all --check`
2. 默认继续执行整个 workspace 的 `cargo clippy`、`cargo check`、`cargo test`
3. 可通过 `SERVER_RS_CHECK_PACKAGE` 将 clippy/check/test 收窄到单个 package
4. `cargo fmt --all --check` 始终覆盖整个 workspace避免多 package 下格式口径漂移
3. 可通过 `SERVER_RS_CHECK_CRATE` 将 clippy/check/test 收窄到单个 crate
4. `cargo fmt --all --check` 始终覆盖整个 workspace避免多 crate 下格式口径漂移
EOF
}
@@ -38,16 +38,18 @@ echo "[server-rs:check] 步骤: cargo fmt --all --check"
cd "${SERVER_RS_DIR}"
cargo fmt --all --check --manifest-path "${MANIFEST_PATH}"
if [[ -n "${SERVER_RS_CHECK_PACKAGE:-}" ]]; then
echo "[server-rs:check] 目标 package: ${SERVER_RS_CHECK_PACKAGE}"
echo "[server-rs:check] 步骤: cargo clippy -p ${SERVER_RS_CHECK_PACKAGE} --all-targets --all-features -D warnings"
cargo clippy -p "${SERVER_RS_CHECK_PACKAGE}" --manifest-path "${MANIFEST_PATH}" --all-targets --all-features -- -D warnings
TARGET_CRATE="${SERVER_RS_CHECK_CRATE:-${SERVER_RS_CHECK_PACKAGE:-}}"
echo "[server-rs:check] 步骤: cargo check -p ${SERVER_RS_CHECK_PACKAGE}"
cargo check -p "${SERVER_RS_CHECK_PACKAGE}" --manifest-path "${MANIFEST_PATH}"
if [[ -n "${TARGET_CRATE}" ]]; then
echo "[server-rs:check] 目标 crate: ${TARGET_CRATE}"
echo "[server-rs:check] 步骤: cargo clippy -p ${TARGET_CRATE} --all-targets --all-features -D warnings"
cargo clippy -p "${TARGET_CRATE}" --manifest-path "${MANIFEST_PATH}" --all-targets --all-features -- -D warnings
echo "[server-rs:check] 步骤: cargo test -p ${SERVER_RS_CHECK_PACKAGE}"
cargo test -p "${SERVER_RS_CHECK_PACKAGE}" --manifest-path "${MANIFEST_PATH}"
echo "[server-rs:check] 步骤: cargo check -p ${TARGET_CRATE}"
cargo check -p "${TARGET_CRATE}" --manifest-path "${MANIFEST_PATH}"
echo "[server-rs:check] 步骤: cargo test -p ${TARGET_CRATE}"
cargo test -p "${TARGET_CRATE}" --manifest-path "${MANIFEST_PATH}"
else
echo "[server-rs:check] 步骤: cargo clippy --workspace --all-targets --all-features -D warnings"
cargo clippy --workspace --manifest-path "${MANIFEST_PATH}" --all-targets --all-features -- -D warnings

View File

@@ -34,8 +34,8 @@ if ([string]::IsNullOrWhiteSpace($RootDir)) {
$RootDir = Join-Path $serverRsDir ".spacetimedb\local"
}
if (-not (Test-Path (Join-Path $serverRsDir "apps\spacetime-module\README.md"))) {
throw "Missing server-rs/apps/spacetime-module/README.md, cannot start SpacetimeDB local dev script."
if (-not (Test-Path (Join-Path $serverRsDir "crates\spacetime-module\README.md"))) {
throw "Missing server-rs/crates/spacetime-module/README.md, cannot start SpacetimeDB local dev script."
}
$spacetimeCommand = Get-Command spacetime -ErrorAction SilentlyContinue
@@ -56,7 +56,7 @@ Write-Host "[server-rs:spacetime-dev] working dir: $serverRsDir"
Write-Host "[server-rs:spacetime-dev] root dir: $RootDir"
Write-Host "[server-rs:spacetime-dev] listen addr: $listenAddress"
Write-Host "[server-rs:spacetime-dev] mode: standalone"
Write-Host "[server-rs:spacetime-dev] note: module publish is deferred until apps/spacetime-module scaffold lands"
Write-Host "[server-rs:spacetime-dev] note: module publish is deferred until crates/spacetime-module scaffold lands"
Push-Location $serverRsDir
try {

View File

@@ -13,7 +13,7 @@ usage() {
说明:
1. 启动 Genarrative Rust 后端使用的本地 standalone SpacetimeDB
2. 默认把本地数据目录放到 `server-rs/.spacetimedb/local`
3. 当前阶段只负责启动 standalone server暂不自动 publish `apps/spacetime-module`
3. 当前阶段只负责启动 standalone server暂不自动 publish `crates/spacetime-module`
EOF
}
@@ -28,8 +28,8 @@ LISTEN_HOST="${GENARRATIVE_SPACETIME_HOST:-127.0.0.1}"
PORT="${GENARRATIVE_SPACETIME_PORT:-3001}"
ROOT_DIR="${GENARRATIVE_SPACETIME_ROOT_DIR:-${SERVER_RS_DIR}/.spacetimedb/local}"
if [[ ! -f "${SERVER_RS_DIR}/apps/spacetime-module/README.md" ]]; then
echo "[server-rs:spacetime-dev] 未找到 apps/spacetime-module/README.md无法启动本地 SpacetimeDB 脚本。" >&2
if [[ ! -f "${SERVER_RS_DIR}/crates/spacetime-module/README.md" ]]; then
echo "[server-rs:spacetime-dev] 未找到 crates/spacetime-module/README.md无法启动本地 SpacetimeDB 脚本。" >&2
exit 1
fi
@@ -46,7 +46,7 @@ echo "[server-rs:spacetime-dev] 工作目录: ${SERVER_RS_DIR}"
echo "[server-rs:spacetime-dev] 数据目录: ${ROOT_DIR}"
echo "[server-rs:spacetime-dev] 监听地址: ${LISTEN_HOST}:${PORT}"
echo "[server-rs:spacetime-dev] 模式: standalone"
echo "[server-rs:spacetime-dev] 说明: 当前阶段暂不自动 publish apps/spacetime-module"
echo "[server-rs:spacetime-dev] 说明: 当前阶段暂不自动 publish crates/spacetime-module"
cd "${SERVER_RS_DIR}"
spacetime --root-dir "${ROOT_DIR}" start --edition standalone --listen-addr "${LISTEN_HOST}:${PORT}"

View File

@@ -2,7 +2,8 @@
param(
[Alias("h")]
[switch]$Help,
[string]$Package = ""
[Alias("Package")]
[string]$Crate = ""
)
$ErrorActionPreference = "Stop"
@@ -11,11 +12,11 @@ function Write-Usage {
@(
'Usage:'
' ./server-rs/scripts/test.ps1'
' ./server-rs/scripts/test.ps1 -Package api-server'
' ./server-rs/scripts/test.ps1 -Crate api-server'
''
'Notes:'
' 1. Run cargo test for the server-rs workspace by default'
' 2. Use -Package to target one workspace package only'
' 2. Use -Crate to target one workspace crate only'
) -join [Environment]::NewLine
}
@@ -36,12 +37,12 @@ Write-Host "[server-rs:test] working dir: $serverRsDir"
Push-Location $serverRsDir
try {
if ([string]::IsNullOrWhiteSpace($Package)) {
if ([string]::IsNullOrWhiteSpace($Crate)) {
cargo test --manifest-path $manifestPath
}
else {
Write-Host "[server-rs:test] target package: $Package"
cargo test -p $Package --manifest-path $manifestPath
Write-Host "[server-rs:test] target crate: $Crate"
cargo test -p $Crate --manifest-path $manifestPath
}
}
finally {

View File

@@ -6,11 +6,11 @@ usage() {
cat <<'EOF'
Usage:
./server-rs/scripts/test.sh
SERVER_RS_TEST_PACKAGE=api-server ./server-rs/scripts/test.sh
SERVER_RS_TEST_CRATE=api-server ./server-rs/scripts/test.sh
Notes:
1. Run cargo test for the server-rs workspace by default
2. Use SERVER_RS_TEST_PACKAGE to target one workspace package only
2. Use SERVER_RS_TEST_CRATE to target one workspace crate only
EOF
}
@@ -32,9 +32,11 @@ echo "[server-rs:test] working dir: ${SERVER_RS_DIR}"
cd "${SERVER_RS_DIR}"
if [[ -n "${SERVER_RS_TEST_PACKAGE:-}" ]]; then
echo "[server-rs:test] target package: ${SERVER_RS_TEST_PACKAGE}"
cargo test -p "${SERVER_RS_TEST_PACKAGE}" --manifest-path "${MANIFEST_PATH}"
TARGET_CRATE="${SERVER_RS_TEST_CRATE:-${SERVER_RS_TEST_PACKAGE:-}}"
if [[ -n "${TARGET_CRATE}" ]]; then
echo "[server-rs:test] target crate: ${TARGET_CRATE}"
cargo test -p "${TARGET_CRATE}" --manifest-path "${MANIFEST_PATH}"
else
cargo test --manifest-path "${MANIFEST_PATH}"
fi