cjpm
介绍
CJPM(Cangjie Package Manager)
是仓颉语言的官方包管理工具,用来管理、维护仓颉项目的模块系统,并且提供更简易统一的编译入口,支持自定义编译命令。通过包管理器自动依赖管理实现对引入的多版本三方依赖软件进行分析合并,无需开发者担心多版本依赖冲突问题,大大减轻开发者负担;同时提供基于仓颉语言原生的自定义构建机制,允许开发者在构建的不同阶段增加预处理和后处理流程,实现构建流程可灵活定制,能够满足开发者不同业务场景下的编译构建诉求。
cjpm
基本使用方法
通过 cjpm -h
即可查看主界面,由几个板块组成,从上到下分别是: 当前命令说明、使用示例(Usage)、支持的可用命令(Available subcommands)、支持的配置项(Available options)、更多提示内容。
Cangjie Package Manager
Usage:
cjpm [subcommand] [option]
Available subcommands:
init Init a new cangjie module
check Check the dependencies
update Update cjpm.lock
tree Display the package dependencies in the source code
build Compile the current module
run Compile and run an executable product
test Unittest a local package or module
clean Clean up the target directory
install Install a cangjie binary
uninstall Uninstall a cangjie binary
Available options:
-h, --help help for cjpm
-v, --version version for cjpm
Use "cjpm [subcommand] --help" for more information about a command.
cjpm init
用来初始化一个新的仓颉模块或者工作空间。初始化模块时会默认在当前文件夹创建 cjpm.toml
文件,并且新建 src
源码文件夹,在 src
下生成默认的 main.cj
文件。自定义参数初始化功能支持可以通过 cjpm init -h
查看。
例如:
输入: cjpm init
输出: cjpm init success
cjpm build
用来构建当前仓颉项目,执行该命令前会先检查依赖项,检查通过后调用 cjc
进行构建。支持全量编译、增量编译、交叉编译、并行编译等,更多编译功能支持可以通过 cjpm build -h
查看。通过 cjpm build -V
命令可以打印所有的编译过程命令。
例如:
输入: cjpm build -V
输出:
compile package module1.package1: cjc --import-path target -p "src/package1" --output-type=staticlib -o target/release/module1/libmodule1.package1.a
compile package module1: cjc --import-path target -L target/release/module1 -lmodule1.package1 -p "src" --output-type=exe --output-dir target/release/bin -o main
cjpm build success
cjpm.toml
配置文件说明
配置文件 cjpm.toml
用来配置一些基础信息、依赖项、编译选项等内容,cjpm
主要通过这个文件进行解析执行。
配置文件代码如下所示:
[package] # 单模块配置字段,与 workspace 字段不能同时存在
cjc-version = "0.49.1" # 所需 `cjc` 的最低版本要求,必需
name = "demo" # 模块名及模块 root 包名,必需
description = "nothing here" # 描述信息,非必需
version = "1.0.0" # 模块版本信息,必需
compile-option = "" # 额外编译命令选项,非必需
link-option = "" # 链接器透传选项,可透传安全编译命令,非必需
output-type = "executable" # 编译输出产物类型,必需
src-dir = "" # 指定源码存放路径,非必需
target-dir = "" # 指定产物存放路径,非必需
package-configuration = {} # 单包配置选项,非必需
[workspace] # 工作空间管理字段,与 package 字段不能同时存在
members = [] # 工作空间成员模块列表,必需
build-members = [] # 工作空间编译模块列表,需要是成员模块列表的子集,非必需
test-members = [] # 工作空间测试模块列表,需要是编译模块列表的子集,非必需
compile-option = "" # 应用于所有工作空间成员模块的额外编译命令选项,非必需
link-option = "" # 应用于所有工作空间成员模块的链接器透传选项,非必需
target-dir = "" # 指定产物存放路径,非必需
[dependencies] # 源码依赖配置项
coo = { git = "xxx",branch = "dev" , version = "1.0.0"} # 导入 `git` 依赖,`version`字段可缺省
doo = { path = "./pro1" ,version = "1.0.0"} # 导入源码依赖,`version`字段可缺省
[test-dependencies] # 测试阶段的依赖配置项,格式同 dependencies
[script-dependencies] # 构建脚本的依赖配置项,格式同 dependencies
[ffi.c] # 导入 `c` 库依赖
clib1.path = "xxx"
[profile] # 命令剖面配置项
build = {}
test = {}
customized-option = {}
[target.x86_64-unknown-linux-gnu] # 后端和平台隔离配置项
compile-option = "value1" # 额外编译命令选项,适用于特定 target 的编译流程和指定该 target 作为交叉编译目标平台的编译流程,非必需
link-option = "value2" # 链接器透传选项,适用于特定 target 的编译流程和指定该 target 作为交叉编译目标平台的编译流程,非必需
[target.x86_64-w64-mingw32.dependencies] # 适用于对应 target 的源码依赖配置项,非必需
[target.x86_64-w64-mingw32.test-dependencies] # 适用于对应 target 的测试阶段依赖配置项,非必需
[target.x86_64-unknown-linux-gnu.bin-dependencies] # 仓颉二进制库依赖,适用于特定 target 的编译流程和指定该 target 作为交叉编译目标平台的编译流程,非必需
path-option = ["./test/pro0", "./test/pro1"]
[target.x86_64-unknown-linux-gnu.bin-dependencies.package-option]
"pro0.xoo" = "./test/pro0/pro0.xoo.cjo"
"pro0.yoo" = "./test/pro0/pro0.yoo.cjo"
"pro1.zoo" = "./test/pro1/pro1.zoo.cjo"