| # `cue` command reference |
| |
| This documentation is a formatted from of the builtin documentation of the |
| cue help command. |
| |
| ## General usage |
| |
| ``` |
| cue [command] |
| ``` |
| |
| The commands are: |
| |
| ``` |
| cmd run a user-defined shell command |
| eval evaluate a configuration file |
| export outputs an evaluated configuration in a standard format |
| extract |
| fmt formats Cue configuration files. |
| help Help about any command |
| import convert other data formats to CUE files |
| list list packages or modules |
| serve starts a builtin or user-defined service |
| |
| Flags: |
| --config string config file (default is $HOME/.cue) |
| --debug give detailed error info |
| -h, --help help for cue |
| --pkg string CUE package to evaluate |
| --root load a Cue package from its root |
| ``` |
| |
| ## Start a bug report |
| |
| TODO |
| |
| ## Evaluate a CUE file |
| |
| ``` |
| Flags: |
| --pkg string Cue package to evaluate |
| ``` |
| |
| ## Formatting CUE files |
| |
| `fmt` formats the given files or the files for the given packages in place. |
| |
| Usage: |
| ``` |
| cue fmt [-s] [packages] [flags] |
| ``` |
| Flags: |
| ``` |
| --config string config file (default is $HOME/.cue) |
| --debug give detailed error info |
| -n, --dryrun only run simulation |
| -p, --package string Cue package to evaluate |
| -s, --simplify simplify output |
| ``` |
| |
| ## Exporting results |
| |
| `export` evaluates the configuration found in the current directory |
| and prints the emit value to stdout. |
| |
| Examples: |
| Evaluated and emit |
| |
| ``` |
| # a single file |
| cue export config.cue |
| |
| # multiple files: these are combined at the top-level. |
| # Order doesn't matter. |
| cue export file1.cue foo/file2.cue |
| |
| # all files within the "mypkg" package: this includes all files |
| # in the current directory and its ancestor directories that are marked |
| # with the same package. |
| cue export -p cloud |
| |
| # the -p flag can be omitted if the directory only contains files for |
| # the "mypkg" package. |
| cue export |
| ``` |
| |
| ### Emit value |
| |
| For CUE files, the generated configuration is derived from the top-level single expression, the emit value. For example, the file |
| |
| ``` |
| // config.cue |
| arg1: 1 |
| arg2: "my string" |
| |
| { |
| a: arg1 |
| b: arg2 |
| } |
| ``` |
| yields the following JSON: |
| ``` |
| { |
| "a": 1, |
| "b": "my string" |
| } |
| ``` |
| In absence of arguments, the current directory is loaded as a package instance. |
| A package instance for a directory contains all files in the directory and its |
| ancestor directories, up to the module root, belonging to the same package. |
| |
| If the package is not explicitly defined by the '-p' flag, it must be uniquely |
| defined by the files in the current directory. |
| |
| ## Import files in another format |
| |
| `import` converts other data formats, like JSON and YAML to CUE files. |
| The following file formats are currently supported: |
| |
| ``` |
| Format Extensions |
| JSON .json .jsonl .ndjson |
| YAML .yaml .yml |
| ``` |
| |
| Files can either be specified explicitly, or inferred from the specified |
| packages. |
| In either case, the file extension is replaced with `.cue`. |
| It will fail if the file already exists by default. |
| The -f flag overrides this. |
| |
| Examples: |
| |
| ``` |
| # Convert individual files: |
| $ cue import foo.json bar.json # create foo.yaml and bar.yaml |
| |
| # Convert all json files in the indicated directories: |
| $ cue import ./... -type=json |
| ``` |
| |
| |
| ### The `--path` flag |
| |
| By default the parsed files are included as emit values. |
| This default can be overridden by specifying a path, which has two forms: |
| |
| ``` |
| -p ident* |
| ``` |
| |
| and |
| ``` |
| -p ident "->" expr* |
| ``` |
| |
| The first form specifies a fixed path. |
| The empty path indicates including the value at the root. |
| The second form allows expressing the path in terms of the imported value. |
| An unbound identifier in the second form denotes a fixed name. |
| Packages may be included with the -imports flag. |
| Imports for top-level core packages are elided. |
| |
| |
| ### Handling multiple documents or streams |
| |
| To handle Multi-document files, such as concatenated JSON objects or YAML files |
| with document separators (---) the user must specify either the -path, -list, or |
| -files flag. |
| The -path flag assign each element to a path (identical paths are |
| treated as usual); -list concatenates the entries, and -files causes each entry |
| to be written to a different file. |
| The -files flag may only be used if files are explicitly imported. |
| The -list flag may be used in combination with the -path |
| flag, concatenating each entry to the mapped location. |
| |
| Examples: |
| |
| ``` |
| $ cat <<EOF > foo.yaml |
| kind: Service |
| name: booster |
| EOF |
| |
| # include the parsed file as an emit value: |
| $ cue import foo.yaml |
| $ cat foo.cue |
| { |
| kind: Service |
| name: booster |
| } |
| |
| # include the parsed file at the root of the Cue file: |
| $ cue import -f -p "" foo.yaml |
| $ cat foo.cue |
| kind: Service |
| name: booster |
| |
| # include the import config at the mystuff path |
| $ cue import -f -p mystuff foo.yaml |
| $ cat foo.cue |
| myStuff: { |
| kind: Service |
| name: booster |
| } |
| |
| # append another object to the input file |
| $ cat <<EOF >> foo.yaml |
| --- |
| kind: Deployment |
| name: booster |
| replicas: 1 |
| |
| # base the path values on th input |
| $ cue import -f -p "x -> strings.ToLower(x.kind) x.name" foo.yaml |
| $ cat foo.cue |
| service booster: { |
| kind: "Service" |
| name: "booster" |
| } |
| |
| deployment booster: { |
| kind: "Deployment" |
| name: "booster |
| replicas: 1 |
| } |
| |
| # base the path values on th input |
| $ cue import -f -list -foo.yaml |
| $ cat foo.cue |
| [{ |
| kind: "Service" |
| name: "booster" |
| }, { |
| kind: "Deployment" |
| name: "booster |
| replicas: 1 |
| }] |
| |
| # base the path values on th input |
| $ cue import -f -list -p "x->strings.ToLower(x.kind)" foo.yaml |
| $ cat foo.cue |
| service: [{ |
| kind: "Service" |
| name: "booster" |
| } |
| deployment: [{ |
| kind: "Deployment" |
| name: "booster |
| replicas: 1 |
| }] |
| ``` |
| |
| Usage: |
| ``` |
| cue import [flags] |
| ``` |
| |
| Flags: |
| ``` |
| --dryrun force overwriting existing files |
| --files force overwriting existing files |
| --fix string apply given fix |
| -f, --force force overwriting existing files |
| -h, --help help for import |
| --list concatenate multiple objects into a list |
| -n, --name string glob filter for file names |
| -o, --out string alternative output or - for stdout |
| -p, --path string path to include root |
| --type string only apply to files of this type |
| ``` |
| |
| ## Extracting CUE files from source code |
| |
| TODO: doc |
| |
| ## Running scripts with CUE |
| |
| `cmd` executes user-defined named commands for each of the listed instances. |
| |
| Commands define actions on instances. |
| For instance, they may define how to upload a configuration to Kubernetes. |
| Commands are defined in cue files ending with `_tool.cue` while otherwise using |
| the same packaging rules: tool files must have a matching package clause and |
| the same rules as for normal files define which will be included in which |
| package. |
| Tool files have access to the package scope, but none of the fields defined |
| in a tool file influence the output of a package. |
| Tool files are typically defined at the module root so that they apply |
| to all instances. |
| |
| |
| ### Tasks |
| |
| Each command consists of one or more tasks. |
| A task may load or write a file, consult a user on the command line, |
| or fetch a web page, and so on. |
| Each task has inputs and outputs. |
| Outputs are typically are typically filled out by the task implementation as |
| the task completes. |
| |
| Inputs of tasks my refer to outputs of other tasks. |
| The cue tool does a static analysis of the configuration and only starts tasks |
| that are fully specified. |
| Upon completion of each task, cue rewrites the instance, |
| filling in the completed task, and reevaluates which other tasks can now start, |
| and so on until all tasks have completed. |
| |
| |
| ### Command definition |
| |
| Commands are defined at the top-level of the configuration and all follow the |
| following pattern: |
| |
| ``` |
| command <Name>: { // from "cue/tool".Command |
| // usage gives a short usage pattern of the command. |
| // Example: |
| // fmt [-n] [-x] [packages] |
| usage: Name | string |
| |
| // short gives a brief on-line description of the command. |
| // Example: |
| // reformat package sources |
| short: "" | string |
| |
| // long gives a detailed description of the command, including |
| // a description of flags usage and examples. |
| long: "" | string |
| |
| // A task defines a single action to be run as part of this command. |
| // Each task can have inputs and outputs, depending on the type |
| // task. The outputs are initially unspecified, but are filled out |
| // by the tooling |
| // |
| task <Name>: { // from "cue/tool".Task |
| // supported fields depend on type |
| } |
| |
| VarValue = string | bool | int | float | [...string|int|float] |
| |
| // var declares values that can be set by command line flags or |
| // environment variables. |
| // |
| // Example: |
| // // environment to run in |
| // var env: "test" | "prod" |
| // The tool would print documentation of this flag as: |
| // Flags: |
| // --env string environment to run in: test(default) or prod |
| var <Name>: VarValue |
| |
| // flag defines a command line flag. |
| // |
| // Example: |
| // var env: "test" | "prod" |
| // |
| // // augment the flag information for var |
| // flag env: { |
| // shortFlag: "e" |
| // description: "environment to run in" |
| // } |
| // |
| // The tool would print documentation of this flag as: |
| // Flags: |
| // -e, --env string environment to run in: test(default), staging, or prod |
| // |
| flag <Name>: { // from "cue/tool".Flag |
| // value defines the possible values for this flag. |
| // The default is string. Users can define default values by |
| // using disjunctions. |
| value: env[Name].value | VarValue |
| |
| // name, if set, allows var to be set with the command-line flag |
| // of the given name. null disables the command line flag. |
| name: Name | null | string |
| |
| // short defines an abbreviated version of the flag. |
| // Disabled by default. |
| short: null | string |
| } |
| |
| // populate flag with the default values for |
| flag: { "\(k)": { value: v } | null for k, v in var } |
| |
| // env defines environment variables. It is populated with values |
| // for var. |
| // |
| // To specify a var without an equivalent environment variable, |
| // either specify it as a flag directly or disable the equally |
| // named env entry explicitly: |
| // |
| // var foo: string |
| // env foo: null // don't use environment variables for foo |
| // |
| env <Name>: { |
| // name defines the environment variable that sets this flag. |
| name: "CUE_VAR_" + strings.Upper(Name) | string | null |
| |
| // The value retrieved from the environment variable or null |
| // if not set. |
| value: null | string | bytes |
| } |
| env: { "\(k)": { value: v } | null for k, v in var } |
| } |
| ``` |
| |
| Available tasks can be found in the package documentation at |
| |
| ``` |
| cmd/cue/tool/tasks. |
| ``` |
| |
| More on tasks can be found in the tasks topic. |
| |
| Examples |
| A simple file using command line execution: |
| |
| hello.cue: |
| ``` |
| package foo |
| |
| import "cue/tool/tasks/exec" |
| |
| city: "Amsterdam" |
| ``` |
| |
| hello_tool.cue: |
| ``` |
| package foo |
| |
| // Say hello! |
| command hello: { |
| // whom to say hello to |
| var who: "World" | string |
| |
| task print: exec.Run({ |
| cmd: "echo Hello \(var.who)! Welcome to \(city)." |
| }) |
| } |
| ``` |
| |
| Invoking the script on the command line: |
| |
| ``` |
| $ cue cmd echo |
| Hello World! Welcome to Amsterdam. |
| |
| $ cue cmd echo -who you |
| Hello you! Welcome to Amsterdam. |
| ``` |
| An example with tasks depending on each other: |
| |
| ``` |
| package foo |
| |
| import "cue/tool/tasks/exec" |
| |
| city: "Amsterdam" |
| |
| // Say hello! |
| command hello: { |
| var file: "out.txt" | string // save transcript to this file |
| |
| task ask: cli.Ask({ |
| prompt: "What is your name?" |
| response: string |
| }) |
| |
| // starts after ask |
| task echo: exec.Run({ |
| cmd: "echo Hello \(task.ask.response)!"] |
| stdout: string // capture stdout |
| }) |
| |
| // starts after echo |
| task write: file.Append({ |
| filename: var.file |
| contents: task.echo.stdout |
| }) |
| |
| // also starts after echo |
| task print: cli.Print({ |
| contents: task.echo.stdout |
| }) |
| } |
| ``` |