بنقرة واحدة
cangjie-entry-args
仓颉语言命令行参数处理。当需要了解仓颉 main 函数如何接收命令行参数、如何使用 std.argopt 包解析短选项/长选项/组合选项、如何开发 CLI 工具时,应使用此 Skill。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
仓颉语言命令行参数处理。当需要了解仓颉 main 函数如何接收命令行参数、如何使用 std.argopt 包解析短选项/长选项/组合选项、如何开发 CLI 工具时,应使用此 Skill。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
当需要构建鸿蒙应用项目时,使用此 Skill 执行构建流程。此 Skill 包含完整的构建命令、构建流程说明、构建失败处理流程。构建脚本会自动执行依赖安装、仓颉预编译、资源生成、编译、打包等步骤。
在鸿蒙应用(Cangjie)开发中,当需要使用 stdx 拓展库(如 crypto、encoding、net、log、actors 等),或在构建/链接阶段出现 stdx 相关错误时,使用此 Skill 获取/解压 stdx 包,并指导在 entry/cjpm.toml 中正确配置 bin-dependencies.path-option。
在进行仓颉工程或鸿蒙应用开发时的第一步,应该优先读取该SKILL,用来确定后续的开发步骤。
仓颉语言内置注解。当需要了解仓颉 SDK 提供的内置注解(@sourcePackage/@sourceFile/@sourceLine/@When/@FastNative/@Frozen/@Attribute/@Deprecated)的用途、语法和最优实践时,应使用此 Skill。
仓颉语言附录参考。当需要查阅仓颉语言的关键字列表、运算符优先级与结合性、运算符重载函数签名、运行时环境变量配置、包兼容性规则、TokenKind枚举类型时,应使用此 Skill。
仓颉标准库 Array 类型详细指南。当需要了解 Array 的构造、元素访问、切片、拼接、查找、排序、拷贝、反转、映射、扁平化等操作的完整 API 和用法时,应使用此 Skill。
| name | cangjie-entry-args |
| description | 仓颉语言命令行参数处理。当需要了解仓颉 main 函数如何接收命令行参数、如何使用 std.argopt 包解析短选项/长选项/组合选项、如何开发 CLI 工具时,应使用此 Skill。 |
main 函数可以接收一个 Array<String> 类型的参数,用于获取命令行参数main 函数main 函数不能有访问修饰符Array<String>,不支持其他类型Unit 或整数类型(如 Int64)// 无参数
main(): Unit { }
main(): Int64 { return 0 }
// 带命令行参数
main(args: Array<String>): Unit { }
main(args: Array<String>): Int64 { return 0 }
main(args: Array<String>): Unit {
println("参数个数: ${args.size}")
for (arg in args) {
println(arg)
}
}
运行:
$ cjc main.cj && ./main Hello World
参数个数: 2
Hello
World
注意:
args不包含可执行文件名本身,只包含传递给程序的参数。
导入:import std.argopt.*
std.argopt 包提供了结构化的命令行参数解析能力,支持短选项、长选项、组合选项、可选值和必选值,适合开发 CLI 工具。
| 类型 / 函数 | 签名 | 说明 |
|---|---|---|
parseArguments | parseArguments(args: Array<String>, specs: Array<ArgumentSpec>): ParsedArguments | 解析命令行参数 |
ParsedArguments | options: ReadOnlyMap<String, String>, nonOptions: Array<String> | 解析结果 |
ArgumentParseException | — | 解析失败时抛出的异常 |
| 构造器 | 说明 |
|---|---|
Short(Rune, ArgumentMode) | 短选项(如 -v) |
Short(Rune, ArgumentMode, (String) -> Unit) | 短选项 + 回调 |
Long(String, ArgumentMode) | 长选项(如 --verbose) |
Long(String, ArgumentMode, (String) -> Unit) | 长选项 + 回调 |
Full(String, Rune, ArgumentMode) | 同时定义长短选项(如 --output / -o) |
Full(String, Rune, ArgumentMode, (String) -> Unit) | 同时定义长短选项 + 回调 |
NonOptions((Array<String>) -> Unit) | 非选项参数回调 |
| 模式 | 说明 | 长选项格式 | 短选项格式 |
|---|---|---|---|
NoValue | 不接受值(开关标志) | --flag | -f |
RequiredValue | 必须提供值 | --name=value 或 --name value | -n value 或 -nvalue |
OptionalValue | 值可选 | --name=value 或 --name | -nvalue 或 -n |
--(双横线)终止选项扫描,其后所有参数都被视为非选项-abc 等价于 -a -b -c(当 a、b、c 均为 NoValue 时)NoValue 选项时,剩余部分作为该选项的值import std.argopt.*
main(args: Array<String>): Unit {
let specs = [
Short(r'v', NoValue), // -v 开关
Long("output", RequiredValue), // --output <file>
Full("help", r'h', NoValue) // --help 或 -h
]
try {
let result = parseArguments(args, specs)
// 检查开关选项
if (result.options.contains("help") || result.options.contains('h')) {
println("Usage: mytool [-v] [--output <file>] <input>...")
return
}
let verbose = result.options.contains('v')
let output = result.options.get("output") // ?String
if (verbose) {
println("Verbose mode enabled")
}
if (let Some(outFile) <- output) {
println("Output file: ${outFile}")
}
// 非选项参数(如输入文件列表)
println("Input files: ${result.nonOptions}")
} catch (e: ArgumentParseException) {
println("Error: ${e}")
println("Usage: mytool [-v] [--output <file>] <input>...")
}
}
运行:
$ ./mytool -v --output result.txt file1.txt file2.txt
Verbose mode enabled
Output file: result.txt
Input files: [file1.txt, file2.txt]
$ ./mytool --help
Usage: mytool [-v] [--output <file>] <input>...
回调方式适合在解析时立即处理每个参数:
import std.argopt.*
main(args: Array<String>): Unit {
var verbose = false
var output = ""
var inputs = Array<String>([])
let specs = [
Short(r'v', NoValue) { _ => verbose = true },
Long("output", RequiredValue) { v => output = v },
Full("config", r'c', RequiredValue) { v =>
println("Loading config: ${v}")
},
NonOptions { files => inputs = files }
]
try {
parseArguments(args, specs)
println("Verbose: ${verbose}, Output: ${output}")
println("Inputs: ${inputs}")
} catch (e: ArgumentParseException) {
println("Error: ${e}")
}
}
import std.argopt.*
import std.fs.*
import std.io.*
import std.env.*
main(args: Array<String>): Unit {
var showHelp = false
var showVersion = false
var outputPath = ""
var format = "text"
var inputFiles = Array<String>([])
let specs = [
Full("help", r'h', NoValue) { _ => showHelp = true },
Full("version", r'V', NoValue) { _ => showVersion = true },
Full("output", r'o', RequiredValue) { v => outputPath = v },
Full("format", r'f', RequiredValue) { v => format = v },
NonOptions { files => inputFiles = files }
]
try {
parseArguments(args, specs)
} catch (e: ArgumentParseException) {
eprintln("Error: ${e}")
eprintln("Try '--help' for more information.")
exit(1)
}
if (showVersion) {
println("mytool 1.0.0")
return
}
if (showHelp || inputFiles.isEmpty()) {
println("Usage: mytool [OPTIONS] <files>...")
println("")
println("Options:")
println(" -h, --help Show help message")
println(" -V, --version Show version")
println(" -o, --output <file> Output file (default: stdout)")
println(" -f, --format <fmt> Output format: text|json (default: text)")
return
}
// 处理输入文件
for (file in inputFiles) {
if (!exists(file)) {
eprintln("Error: file not found: ${file}")
continue
}
let content = File.readFrom(file)
println("Processing: ${file} (${content.size} bytes)")
}
}
运行:
$ ./mytool --version
mytool 1.0.0
$ ./mytool -o out.json -f json input.txt
Processing: input.txt (1024 bytes)
$ ./mytool --help
Usage: mytool [OPTIONS] <files>...
Options:
-h, --help Show help message
-V, --version Show version
-o, --output <file> Output file (default: stdout)
-f, --format <fmt> Output format: text|json (default: text)
| 需求 | 做法 |
|---|---|
| 获取原始命令行参数 | main(args: Array<String>) |
| 解析结构化选项 | import std.argopt.* + parseArguments() |
定义开关标志(如 -v) | Short(r'v', NoValue) |
定义必选值选项(如 --output file) | Long("output", RequiredValue) |
同时支持长短选项(如 -o / --output) | Full("output", r'o', RequiredValue) |
| 获取非选项参数(如文件列表) | result.nonOptions 或 NonOptions { files => ... } |
| 处理解析错误 | try { ... } catch (e: ArgumentParseException) { ... } |
| 终止选项扫描 | 命令行中使用 --,之后的参数都视为非选项 |