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.
|