원클릭으로
cangjie-project-management
仓颉项目管理工具 cjpm 的用法指导,包括创建项目、项目配置(cjpm.toml)、管理依赖、构建、运行、测试、清理、安装、工作区、交叉编译、构建脚本(build.cj)、增量编译、环境变量替换等
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
仓颉项目管理工具 cjpm 的用法指导,包括创建项目、项目配置(cjpm.toml)、管理依赖、构建、运行、测试、清理、安装、工作区、交叉编译、构建脚本(build.cj)、增量编译、环境变量替换等
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | cangjie-project-management |
| description | 仓颉项目管理工具 cjpm 的用法指导,包括创建项目、项目配置(cjpm.toml)、管理依赖、构建、运行、测试、清理、安装、工作区、交叉编译、构建脚本(build.cj)、增量编译、环境变量替换等 |
cjpm(Cangjie Project Manager)是仓颉语言官方项目管理工具,负责模块初始化、依赖检查/更新、增量/并行编译、自定义构建命令等。
init — 初始化项目cjpm init --name myapp --type=executable
cjpm init --workspace
cjpm.toml 和 src/ 目录;可执行类型时生成 src/main.cj--workspace — 创建工作区配置--name <value> — 设置根包名(默认:父目录名)--path <value> — 模块路径(默认:当前目录)--type=<executable|static|dynamic> — 输出类型(默认:executable)build — 构建项目cjpm build
cjpm build -V -g # 调试模式,详细输出
cjpm build -j 4 # 4 并行任务
cjpm build --target <triple> # 交叉编译
cjc 编译-i/--incremental — 包级增量编译-j/--jobs <N> — 最大并行任务数-V/--verbose — 显示编译日志-g — 调试构建(输出到 target/debug/bin)--coverage — 生成覆盖率信息-o/--output <value> — 指定可执行文件名-l/--lint — 运行 cjlint 静态分析--mock — 启用 mock 支持--target <value> — 交叉编译目标平台--skip-script — 跳过构建脚本target/,可执行文件 → target/release/bin 或 target/debug/binrun — 构建并运行cjpm run
cjpm run --run-args "arg1 arg2"
cjpm run --skip-build
build--name(二进制名)、--build-args、--run-args、--skip-buildtest — 运行单元测试cjpm test
cjpm test src src/koo # 测试指定包
cjpm test --filter "MyTest*.*"
target/release/unittest_binxxx_test.cj 与 xxx.cj 并列--filter <value> — 过滤测试(通配符:*、MyTest*.*Test、-*.*exclude)--include-tags/--exclude-tags — 按标签过滤--timeout-each <value> — 单个测试超时(如 10s、500millis)--parallel <value> — 并行执行--no-run — 仅编译--skip-build — 仅运行--dry-run — 打印测试列表--report-path/--report-format — 测试报告bench — 运行基准测试cjpm bench
cjpm bench --report-format csv
@Bench 标注的性能测试test 类似,额外支持 --baseline-path(对比基准)clean — 清理构建产物cjpm clean
cjpm clean --coverage
target/ 目录。--coverage 同时清理覆盖率文件check — 检查依赖update — 更新 cjpm.lockcjpm.toml 到 cjpm.lock;记录 git 依赖版本元数据tree — 可视化依赖树cjpm tree -V --depth 3
install / uninstall — 安装/卸载cjpm install --path .
cjpm install --git "https://..." --tag v1.0.0
cjpm uninstall myapp
[package] — 单模块配置[package]
cjc-version = "0.55.3" # 最低 cjc 版本(必填)
name = "myapp" # 模块名和根包名(必填)
version = "1.0.0" # 模块版本(必填)
output-type = "executable" # 输出类型:executable|static|dynamic(必填)
description = "My app" # 描述(可选)
compile-option = "-O2" # 额外编译选项(可选)
link-option = "" # 链接器选项(可选)
src-dir = "src" # 源码目录(默认 src)
target-dir = "target" # 输出目录(默认 target)
[workspace] — 工作区配置(与 [package] 互斥)[workspace]
members = ["module_a", "module_b"]
build-members = ["module_a"]
test-members = ["module_a"]
compile-option = ""
target-dir = "target"
[dependencies] — 依赖配置[dependencies]
# 本地依赖
pro0 = { path = "./pro0" }
# Git 依赖(优先级:commitId > branch > tag)
pro1 = { git = "https://...", tag = "v1.0.0" }
pro2 = { git = "https://...", branch = "dev" }
pro3 = { git = "https://...", commitId = "abc123" }
# 覆盖依赖输出类型
pro4 = { path = "./pro4", output-type = "dynamic" }
[test-dependencies] — 测试专用依赖[dependencies],仅在 xxx_test.cj 文件中可用[script-dependencies] — 构建脚本依赖[dependencies],仅用于 build.cj 脚本[replace] — 依赖替换pro0 = { path = "./local_pro0" }replace 生效[ffi.c] — C 库 FFI 依赖[ffi.c]
hello = { path = "./src/" }
.so/.a 文件到指定路径[profile] — 配置[profile.build]
lto = "full" # 链接时优化:full|thin
incremental = true # 增量编译
[profile.test]
filter = "MyTest*"
timeout-each = "10s"
parallel = "4"
[profile.test.build]
compile-option = ""
mock = "on" # on|off|runtime-error
[profile.test.env]
MY_VAR = { value = "abc", splice-type = "replace" }
[profile.bench]
report-path = "bench_report"
report-format = "csv"
baseline-path = "old_report"
[profile.customized-option]
feature_x = "--cfg=\"feature=x\""
optimize = "-O2"
启用:cjpm build --feature_x --optimize
[target] — 平台/后端特定配置[target.x86_64-unknown-linux-gnu]
compile-option = ""
link-option = ""
[target.x86_64-unknown-linux-gnu.dependencies]
pro0 = { path = "./pro0_linux" }
[target.x86_64-unknown-linux-gnu.bin-dependencies]
path-option = ["./libs/"]
[target.name.bin-dependencies]
path-option = ["./path1", "./path2"] # 自动导入路径下的仓颉库
[target.name.bin-dependencies.package-option]
"pro0.xoo" = "./test/pro0/pro0.xoo.cjo" # 精确映射
package-configuration — 子包配置[package.package-configuration.sub_pkg]
output-type = "executable" # 子包可独立生成可执行文件
compile-option = "-O1"
${ENV_VAR}compile-option、link-option、target-dir、members、path 等.cj 文件.cj 文件的目录及其子目录被忽略(带警告)build 时自动创建,用于可复现构建cjpm update 手动刷新cjpm.toml 同级),不由 init 创建import std.process.*
main() {
match (Process.current.arguments[0]) {
case "pre-build" => 0
case "post-build" => 0
case "pre-test" => 0
case "post-test" => 0
case _ => 0
}
}
0 = 成功;非零 = 失败(中止命令)pre-build/post-build、pre-test/post-test、pre-bench/post-bench、pre-run/post-run、pre-clean(无 post-clean)--skip-script 跳过所有构建脚本[script-dependencies] 配置(独立于 [dependencies] 和 [test-dependencies])cjpm-xxx(.exe) 并放入 PATHcjpm xxx [args] 调用(等价于 cjpm-xxx [args])# 1. 创建项目
cjpm init --name myapp
# 2. 创建子包
mkdir src/utils
# 3. 创建依赖模块
mkdir mylib && cd mylib && cjpm init --name mylib --type=static
# 4. 配置依赖(编辑 cjpm.toml)
# [dependencies]
# mylib = { path = "mylib" }
# 5. 构建
cjpm build
# 6. 运行
cjpm run
# 7. 编写测试(xxx_test.cj 文件)
cjpm test
# 8. 清理
cjpm clean
cjpm init --name my_app --type=executable
目录结构:
my_app/
├── cjpm.toml
└── src/
└── main.cj
cjpm.toml:
[package]
cjc-version = "0.55.3"
name = "my_app"
version = "1.0.0"
output-type = "executable"
[dependencies]
src/main.cj:
main(): Int64 {
println("Hello, Cangjie!")
return 0
}
cjpm init --name my_lib --type=static
目录结构:
my_lib/
├── cjpm.toml
├── src/
│ ├── lib.cj # 公共 API 入口(public import 重新导出)
│ ├── internal/
│ │ └── impl.cj # 内部实现
│ └── models/
│ └── data.cj # 数据模型
└── src/
└── lib_test.cj # 单元测试
cjpm.toml:
[package]
cjc-version = "0.55.3"
name = "my_lib"
version = "1.0.0"
output-type = "static"
[dependencies]
src/lib.cj(公共 API 入口):
package my_lib
public import my_lib.models.DataModel
public import my_lib.models.Config
src/models/data.cj:
package my_lib.models
public struct DataModel {
public let name: String
public let value: Int64
public init(name: String, value: Int64) {
this.name = name
this.value = value
}
}
public struct Config {
public let debug: Bool
public init(debug!: Bool = false) {
this.debug = debug
}
}
src/internal/impl.cj:
package my_lib.internal
import my_lib.models.*
func processData(data: DataModel): String {
"${data.name}: ${data.value}"
}
src/lib_test.cj:
import my_lib.models.*
@Test
class DataModelTest {
@TestCase
func testCreate() {
let m = DataModel("test", 42)
@Assert(m.name == "test")
@Assert(m.value == 42)
}
}
创建一个包含共享库和可执行应用的 workspace 项目。
mkdir my_project && cd my_project
cjpm init --workspace
cjpm init --type=static --path core
cjpm init --type=executable --path app
目录结构:
my_project/
├── cjpm.toml # workspace 配置
├── core/
│ ├── cjpm.toml # 库模块配置
│ └── src/
│ ├── core.cj # 公共 API
│ ├── models/
│ │ └── user.cj # 数据模型
│ └── core_test.cj # 测试
└── app/
├── cjpm.toml # 应用模块配置
└── src/
└── main.cj # 应用入口
根目录 cjpm.toml(workspace):
[workspace]
members = ["./core", "./app"]
build-members = []
compile-option = ""
link-option = ""
target-dir = ""
test-members = []
[dependencies]
core/cjpm.toml:
[package]
cjc-version = "0.55.3"
name = "core"
version = "1.0.0"
output-type = "static"
[dependencies]
app/cjpm.toml:
[package]
cjc-version = "0.55.3"
name = "app"
version = "1.0.0"
output-type = "executable"
[dependencies]
core = { path = "../core" }
core/src/core.cj:
package core
public import core.models.User
core/src/models/user.cj:
package core.models
public class User {
public var name: String
public var age: Int64
public init(name: String, age: Int64) {
this.name = name
this.age = age
}
public func greet(): String {
"Hello, I'm ${name}, ${age} years old."
}
}
app/src/main.cj:
import core.*
main(): Int64 {
let user = User("Alice", 30)
println(user.greet())
return 0
}
构建与运行:
cjpm build # 构建整个 workspace
cjpm run --name app # 运行 app 模块
cjpm test # 测试所有模块
适用于包含多个独立库和多个可执行程序的大型项目。
mkdir big_project && cd big_project
cjpm init --workspace
cjpm init --type=static --path libs/common
cjpm init --type=static --path libs/network
cjpm init --type=static --path libs/database
cjpm init --type=executable --path apps/server
cjpm init --type=executable --path apps/cli
目录结构:
big_project/
├── cjpm.toml # workspace 配置
├── libs/
│ ├── common/
│ │ ├── cjpm.toml # 通用工具库
│ │ └── src/
│ │ ├── common.cj
│ │ ├── types/
│ │ │ └── result.cj
│ │ └── common_test.cj
│ ├── network/
│ │ ├── cjpm.toml # 网络库(依赖 common)
│ │ └── src/
│ │ ├── network.cj
│ │ └── http/
│ │ ├── client.cj
│ │ └── server.cj
│ └── database/
│ ├── cjpm.toml # 数据库库(依赖 common)
│ └── src/
│ ├── database.cj
│ └── connection.cj
└── apps/
├── server/
│ ├── cjpm.toml # 服务端(依赖 network, database)
│ └── src/
│ └── main.cj
└── cli/
├── cjpm.toml # CLI 工具(依赖 common, database)
└── src/
└── main.cj
根目录 cjpm.toml:
[workspace]
members = [
"./libs/common",
"./libs/network",
"./libs/database",
"./apps/server",
"./apps/cli"
]
build-members = []
compile-option = ""
link-option = ""
target-dir = ""
test-members = []
[dependencies]
libs/network/cjpm.toml(依赖 common):
[package]
cjc-version = "0.55.3"
name = "network"
version = "1.0.0"
output-type = "static"
[dependencies]
common = { path = "../common" }
apps/server/cjpm.toml(依赖 network 和 database):
[package]
cjc-version = "0.55.3"
name = "server"
version = "1.0.0"
output-type = "executable"
[dependencies]
network = { path = "../../libs/network" }
database = { path = "../../libs/database" }
构建与运行:
cjpm build # 构建全部
cjpm run --name server # 运行服务端
cjpm run --name cli # 运行 CLI
cjpm test # 测试全部
cjpm test libs/common/src # 只测试 common 库
cjpm tree -V # 查看完整依赖树
build-members 在开发时只构建正在修改的模块子集test-members 限制 CI 中的测试范围以加快速度通用算法与数据结构实现参考——排序、搜索、动态规划、图算法、字符串处理的多语言惯用写法和模板代码(Python/C++/Java/Go/Cangjie)
仓颉语言算法与数据结构实现参考——排序、搜索、动态规划、图算法、字符串处理、集合操作的惯用写法和模板代码
仓颉编程语言基本概念和规则,当需要了解关键字、标识符、程序结构、变量定义(let/var/const)、值类型与引用类型、作用域规则、表达式(if/while/for-in/break/continue)、函数等基本概念时,应使用此 Skill
仓颉语言基本数据类型。当需要了解仓颉语言的整数、浮点、布尔、字符(Rune)、字符串(String)、Unit、Nothing、元组(Tuple)、数组(Array/VArray)、区间(Range)类型以及基本运算符的语法和规则时,应使用此 Skill。
仓颉程序与C程序互操作指导,包括foreign声明、CFunc、inout参数、unsafe块、调用约定、类型映射(基础类型/结构体/CPointer/VArray/CString)、C回调仓颉、内存管理等特性时,应使用此 Skill
仓颉语言类。当需要了解仓颉语言的类定义、抽象类、构造函数(init/主构造函数)、终结器(~init)、继承(单继承/sealed)、重写(override)、重定义(redef)、成员变量、成员函数、属性(prop)、访问修饰符、This类型、对象创建等特性时,应使用此 Skill。