gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

README.md (4278B)


      1 # HCL
      2 
      3 [![GoDoc](https://godoc.org/github.com/hashicorp/hcl?status.png)](https://godoc.org/github.com/hashicorp/hcl) [![Build Status](https://travis-ci.org/hashicorp/hcl.svg?branch=master)](https://travis-ci.org/hashicorp/hcl)
      4 
      5 HCL (HashiCorp Configuration Language) is a configuration language built
      6 by HashiCorp. The goal of HCL is to build a structured configuration language
      7 that is both human and machine friendly for use with command-line tools, but
      8 specifically targeted towards DevOps tools, servers, etc.
      9 
     10 HCL is also fully JSON compatible. That is, JSON can be used as completely
     11 valid input to a system expecting HCL. This helps makes systems
     12 interoperable with other systems.
     13 
     14 HCL is heavily inspired by
     15 [libucl](https://github.com/vstakhov/libucl),
     16 nginx configuration, and others similar.
     17 
     18 ## Why?
     19 
     20 A common question when viewing HCL is to ask the question: why not
     21 JSON, YAML, etc.?
     22 
     23 Prior to HCL, the tools we built at [HashiCorp](http://www.hashicorp.com)
     24 used a variety of configuration languages from full programming languages
     25 such as Ruby to complete data structure languages such as JSON. What we
     26 learned is that some people wanted human-friendly configuration languages
     27 and some people wanted machine-friendly languages.
     28 
     29 JSON fits a nice balance in this, but is fairly verbose and most
     30 importantly doesn't support comments. With YAML, we found that beginners
     31 had a really hard time determining what the actual structure was, and
     32 ended up guessing more often than not whether to use a hyphen, colon, etc.
     33 in order to represent some configuration key.
     34 
     35 Full programming languages such as Ruby enable complex behavior
     36 a configuration language shouldn't usually allow, and also forces
     37 people to learn some set of Ruby.
     38 
     39 Because of this, we decided to create our own configuration language
     40 that is JSON-compatible. Our configuration language (HCL) is designed
     41 to be written and modified by humans. The API for HCL allows JSON
     42 as an input so that it is also machine-friendly (machines can generate
     43 JSON instead of trying to generate HCL).
     44 
     45 Our goal with HCL is not to alienate other configuration languages.
     46 It is instead to provide HCL as a specialized language for our tools,
     47 and JSON as the interoperability layer.
     48 
     49 ## Syntax
     50 
     51 For a complete grammar, please see the parser itself. A high-level overview
     52 of the syntax and grammar is listed here.
     53 
     54   * Single line comments start with `#` or `//`
     55 
     56   * Multi-line comments are wrapped in `/*` and `*/`. Nested block comments
     57     are not allowed. A multi-line comment (also known as a block comment)
     58     terminates at the first `*/` found.
     59 
     60   * Values are assigned with the syntax `key = value` (whitespace doesn't
     61     matter). The value can be any primitive: a string, number, boolean,
     62     object, or list.
     63 
     64   * Strings are double-quoted and can contain any UTF-8 characters.
     65     Example: `"Hello, World"`
     66 
     67   * Multi-line strings start with `<<EOF` at the end of a line, and end
     68     with `EOF` on its own line ([here documents](https://en.wikipedia.org/wiki/Here_document)).
     69     Any text may be used in place of `EOF`. Example:
     70 ```
     71 <<FOO
     72 hello
     73 world
     74 FOO
     75 ```
     76 
     77   * Numbers are assumed to be base 10. If you prefix a number with 0x,
     78     it is treated as a hexadecimal. If it is prefixed with 0, it is
     79     treated as an octal. Numbers can be in scientific notation: "1e10".
     80 
     81   * Boolean values: `true`, `false`
     82 
     83   * Arrays can be made by wrapping it in `[]`. Example:
     84     `["foo", "bar", 42]`. Arrays can contain primitives,
     85     other arrays, and objects. As an alternative, lists
     86     of objects can be created with repeated blocks, using
     87     this structure:
     88 
     89     ```hcl
     90     service {
     91         key = "value"
     92     }
     93 
     94     service {
     95         key = "value"
     96     }
     97     ```
     98 
     99 Objects and nested objects are created using the structure shown below:
    100 
    101 ```
    102 variable "ami" {
    103     description = "the AMI to use"
    104 }
    105 ```
    106 This would be equivalent to the following json:
    107 ``` json
    108 {
    109   "variable": {
    110       "ami": {
    111           "description": "the AMI to use"
    112         }
    113     }
    114 }
    115 ```
    116 
    117 ## Thanks
    118 
    119 Thanks to:
    120 
    121   * [@vstakhov](https://github.com/vstakhov) - The original libucl parser
    122     and syntax that HCL was based off of.
    123 
    124   * [@fatih](https://github.com/fatih) - The rewritten HCL parser
    125     in pure Go (no goyacc) and support for a printer.