Fake.Core.CommandLineParsing
This module is a fork from https://github.com/docopt/docopt.fs/ but with strong ordering. The strong ordering enables you to have a nice CLI on your script or to write your own fake 5 modules with a CLI.
Example script.fsx
:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: |
|
A more sophisticated example can be found in the fake runner: https://github.com/fsharp/FAKE/blob/64d871f5065412fe7b233025e454ccf3b89e46d7/src/app/Fake.netcore/Program.fs#L204-L259
Or the target module:
- https://github.com/fsharp/FAKE/blob/rc_1/src/app/Fake.Core.Target/Target.fs#L9-L26
- https://github.com/fsharp/FAKE/blob/64d871f5065412fe7b233025e454ccf3b89e46d7/src/app/Fake.Core.Target/Target.fs#L564-L619
You can also take a look at the test-suite:
Differences to the python reference Docopt implementation
-
The parser doesn't differentiate between arguments with and without
-
with regards to ordering. They are subject to the same rules as other arguments. The only exception is when defining multiple arguments like[-a -b -c]
, then the ordering of the group doesn't matter. (So in other words: If a group()
or[]
only has options then the order doesn't matter) Uniquely identifiable prefixes like
--fsia
are not supportedWe return the arguments in the user given order in the result map (difference to
docopt.fs
)-
We parse arguments starting with
-
as positional arguments. For example consider:1: 2: 3:
usage: prog (NAME | --foo NAME) options: --foo
INFO
Note that --foo has no argument because it was not specified in the options section!
In this scenario
prog --foo 10
is parsed as--foo
andNAME
argument because that is the only option. Howeverprog --foo=10
is parsed asNAME
argument without any--foo
option. Usually to prefer--foo
you should put it first in the usage string:1: 2: 3:
usage: prog (--foo NAME | NAME) options: --foo
However, in this particular case it doesn't make any difference (as the options section is missing to indicate that
--foo
has an argument). []
is not inherited for all items, only for the group. To have all items optional use[]
on every item. For exampleusage: prog [go go]
means to have either twogo
or none. A single one is not allowed.-
We do not merge external "options" in the usage string with
[options]
. For example:1: 2: 3: 4:
usage: prog [options] [-a] options: -a -b
Means that
-a
is actually allowed twice.