示例
args 2.7.0: Build and test a package:args CommandRunner subcommand CLI, telling apart which node reports a UsageException and pinning the option rules that differ from argparse, getopt and clap
已验证示例 — pub args 2.7.0: Build and test a package:args CommandRunner subcommand CLI, telling apart which node reports a UsageException and pinning the option…
sha256:d5e47381de03ab961e2135483018d410dd3e1365963e163f552519d3a16f7875
本网络只提供一件事:能构建的样本。它在沙箱中运行并保留签名回执。它不评级、不担保——同样的代码能否在你的环境构建,它没有测量过。
提交了通过的契约回执的不同签名密钥数量。为 1 表示只有作者;大于 1 表示还有其他人构建过。密钥是自行生成的,背后没有注册身份,因此计的是密钥而非人。
MIT-0
执行证据
声明的环境与签名的运行分开呈现,你可以看到这个样本究竟运行了什么、在哪里运行。
- 证据依据
- 签名契约通过
- 验证回执
- 1
- 构建过它的签名密钥
- 1
声明的环境
dart 3 linux x64 dart 3 dart pub
验证运行环境
| 环境 | 契约 | 阶段 | 运行日期 |
|---|---|---|---|
| dart 3 · linux alpine/x64 · docker ed25519:a2ec939a4c60e243 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · pub@1 |
2026-08-14 |
案例
HOW- 目标
- Build and test a package:args CommandRunner subcommand CLI, telling apart which node reports a UsageException and pinning the option rules that differ from argparse, getopt and clap
- 符号
-
- CommandRunner
- CommandRunner.run
- Command.run
- Command.argResults
- Command.usageException
- UsageException
- ArgParser.addFlag
- ArgParser.addOption
- ArgParserException
- ArgResults.flag
- ArgResults.option
- ArgResults.rest
- 环境
- dart 3
- 创建时间
- 2026-08-14T19:59:28Z
契约
- assert a subcommand runs and the value its run returns comes back out of CommandRunner<int>.run, so the exit code travels as a return value and nothing is printed
- assert no arguments, --help and <command> --help all complete with null after printing usage, so null is a success value and Command.run was never reached
- assert an unknown command is a UsageException whose usage is the runner's, with Global options and Available commands, whose toString is message and usage joined, and whose message gains an edit-distance suggestion block only within the default limit of 2
- assert a parse error inside a subcommand is the same UsageException type carrying that subcommand's usage instead of the command list, while a stray word before the command name is reported by the top-level parser and carries the runner's usage again
- assert a unique prefix of a long option is simply an unknown option, because long names are resolved by exact name or alias and no switch adds prefix matching, while the single-letter abbr and an exact alias both work and the alias stays out of the usage block
- assert a collapsed run of single letters takes its value on the FIRST letter, so -tprod sets the option and -vtprod and -vt prod both fail because a later letter must be a flag, and that an unknown letter has one message alone and a different one inside a run
- assert mandatory: true is enforced during parsing only when the option also declares a callback, and that without one the parse succeeds and leaves the option out of the results entirely
- assert the callback-less mandatory option therefore fails as an ArgumentError from ArgResults.option after the command body has already started, while the same declaration with a callback fails as a UsageException during parsing before run is reached
- assert the required option that behaves the same either way is a null check plus an explicit usageException call, throwing UsageException with that command's usage
- assert addFlag creates --no-x for free, including for a flag that already defaults to false, that negatable: false turns --no-x into an error naming the spelling that was typed rather than the declared flag, and that the usage block renders the difference as --[no-]x
- assert everything after -- lands in rest unparsed so a flag past it does not take effect, and that only the first -- is consumed
- assert a -- before the command name stops the top-level parser before it ever looks the command up, so the command that was asked for is reported as unknown while being suggested back
文件
- csx.json
- lib/cli.dart
- pubspec.lock
- pubspec.yaml
- test/contract_test.dart