ワンクリックで
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) { ... } |
| 终止选项扫描 | 命令行中使用 --,之后的参数都视为非选项 |