annotate src/capnproto-0.6.0/doc/capnp-tool.md @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 45360b968bf4
children
rev   line source
cannam@147 1 ---
cannam@147 2 layout: page
cannam@147 3 title: The capnp Tool
cannam@147 4 ---
cannam@147 5
cannam@147 6 # The `capnp` Tool
cannam@147 7
cannam@147 8 Cap'n Proto comes with a command-line tool called `capnp` intended to aid development and
cannam@147 9 debugging. This tool can be used to:
cannam@147 10
cannam@147 11 * Compile Cap'n Proto schemas to produce source code in multiple languages.
cannam@147 12 * Generate unique type IDs.
cannam@147 13 * Decode Cap'n Proto messages to human-readable text.
cannam@147 14 * Encode text representations of Cap'n Proto messages to binary.
cannam@147 15 * Evaluate and extract constants defined in Cap'n Proto schemas.
cannam@147 16
cannam@147 17 This page summarizes the functionality. A complete reference on the command's usage can be
cannam@147 18 found by typing:
cannam@147 19
cannam@147 20 capnp help
cannam@147 21
cannam@147 22 ## Compiling Schemas
cannam@147 23
cannam@147 24 capnp compile -oc++ myschema.capnp
cannam@147 25
cannam@147 26 This generates files `myschema.capnp.h` and `myschema.capnp.c++` which contain C++ source code
cannam@147 27 corresponding to the types defined in `myschema.capnp`. Options exist to control output location
cannam@147 28 and import paths.
cannam@147 29
cannam@147 30 The above example generates C++ code, but the tool is able to generate output in any language
cannam@147 31 for which a plugin is available. Compiler plugins are just regular programs named
cannam@147 32 `capnpc-language`. For example, the above command runs `capnpc-c++`. [More on how to write
cannam@147 33 compiler plugins](otherlang.html#how-to-write-compiler-plugins).
cannam@147 34
cannam@147 35 Note that some Cap'n Proto implementations (especially for interpreted languages) do not require
cannam@147 36 generating source code.
cannam@147 37
cannam@147 38 ## Decoding Messages
cannam@147 39
cannam@147 40 capnp decode myschema.capnp MyType < message.bin > message.txt
cannam@147 41
cannam@147 42 `capnp decode` reads a binary Cap'n Proto message from standard input and decodes it to a
cannam@147 43 human-readable text format (specifically, the format used for specifying constants and default
cannam@147 44 values in [the schema language](language.html)). By default it
cannam@147 45 expects an unpacked message, but you can decode a
cannam@147 46 [packed](encoding.html#packing) message with the `--packed` flag.
cannam@147 47
cannam@147 48 ## Encoding Messages
cannam@147 49
cannam@147 50 capnp encode myschema.capnp MyType < message.txt > message.bin
cannam@147 51
cannam@147 52 `capnp encode` is the opposite of `capnp decode`: it takes a text-format message on stdin and
cannam@147 53 encodes it to binary (possibly [packed](encoding.html#packing),
cannam@147 54 with the `--packed` flag).
cannam@147 55
cannam@147 56 This is mainly useful for debugging purposes, to build test data or to apply tweaks to data
cannam@147 57 decoded with `capnp decode`. You should not rely on `capnp encode` for encoding data written
cannam@147 58 and maintained in text format long-term -- instead, use `capnp eval`, which is much more powerful.
cannam@147 59
cannam@147 60 ## Evaluating Constants
cannam@147 61
cannam@147 62 capnp eval myschema.capnp myConstant
cannam@147 63
cannam@147 64 This prints the value of `myConstant`, a [const](language.html#constants) declaration, after
cannam@147 65 applying variable substitution. It can also output the value in binary format (`--binary` or
cannam@147 66 `--packed`).
cannam@147 67
cannam@147 68 At first glance, this may seem no more interesting that `capnp encode`: the syntax used to define
cannam@147 69 constants in schema files is the same as the format accepted by `capnp encode`, right? There is,
cannam@147 70 however, a big difference: constants in schema files may be defined in terms of other constants,
cannam@147 71 which may even be imported from other files.
cannam@147 72
cannam@147 73 As a result, `capnp eval` is a great basis for implementing config files. For example, a large
cannam@147 74 company might maintain a production server that serves dozens of clients and needs configuration
cannam@147 75 information about each one. Rather than maintaining the config as one enormous file, it can be
cannam@147 76 written as several separate files with a master file that imports the rest.
cannam@147 77
cannam@147 78 Such a configuration should be compiled to binary format using `capnp eval` before deployment,
cannam@147 79 in order to verify that there are no errors and to make deployment easier and faster. While you
cannam@147 80 could technically ship the text configs to production and have the servers parse them directly
cannam@147 81 (e.g. with `capnp::SchemaParser`), encoding before deployment is more efficient and robust.