HCL是一種用於創建人類和機器友好型的結構化配置語言的工具包,可與命令行工具一起使用。儘管打算通常有用,但主要針對DevOps工具,服務器等。
注意:這是HCL的主要版本2,其GO API與主要版本1不兼容。這兩個版本都可以在GO模塊項目中進行選擇。 HCl 2不能從不使用GO模塊的GO項目中導入。有關更多信息,請參閱我們的版本選擇指南。
HCL既具有本地語法,旨在為人類閱讀和寫作令人愉快,也是一個基於JSON的變體,可以使機器更容易生成和解析。
HCl本地語法的靈感來自libucl,nginx配置等。
它包括一個表達式語法,該語法允許基本的內聯計算,並在調用應用程序的支持下,將變量和功能用於更動態的配置語言。
HCL提供了一組構造,可以通過調用應用程序將其用於構造配置語言。該應用程序定義了預期的屬性名稱和嵌套塊類型,HCL解析了配置文件,驗證其符合預期結構的內容,並返回該應用程序可以用於進一步處理的高級對象。
package main
import (
"log"
"github.com/hashicorp/hcl/v2/hclsimple"
)
type Config struct {
IOMode string `hcl:"io_mode"`
Service ServiceConfig `hcl:"service,block"`
}
type ServiceConfig struct {
Protocol string `hcl:"protocol,label"`
Type string `hcl:"type,label"`
ListenAddr string `hcl:"listen_addr"`
Processes [] ProcessConfig `hcl:"process,block"`
}
type ProcessConfig struct {
Type string `hcl:"type,label"`
Command [] string `hcl:"command"`
}
func main () {
var config Config
err := hclsimple . DecodeFile ( "config.hcl" , nil , & config )
if err != nil {
log . Fatalf ( "Failed to load configuration: %s" , err )
}
log . Printf ( "Configuration is %#v" , config )
}
可用於更低級別的API,用於需要對配置的解析,解碼和評估進行更多控制的應用程序。有關更多信息,請參閱包裝文檔。
HCL的新來者經常問:為什麼不JSON,YAML等?
JSON和YAML是用於序列化數據結構的格式,而HCl是一種專門設計用於構建結構化配置格式的語法和API。
HCL試圖在通用序列化格式(例如JSON和圍繞Ruby等完整編程語言)建立的配置格式等通用序列化格式之間進行妥協。 HCL語法旨在容易被人類讀取和撰寫,並允許聲明的邏輯允許其在更複雜的應用程序中使用。
HCl旨在作為圍繞鍵值對和層次塊構建的配置格式的基本語法,其結構由調用應用程序很好地定義,並且配置結構的這種定義允許在調用應用程序中提供更好的錯誤消息和更方便的定義。
不能否認JSON作為通用語言非常方便,可以在不同的軟件之間進行互操作。因此,HCL定義了一個常見的配置模型,該模型可以從其本地語法或明確定義的等效JSON結構中解析。這允許將配置作為本機語法中的人為構成配置文件的混合物和JSON中的機器生成的文件提供。
HCL圍繞兩個主要概念建立:屬性和塊。在本機語法中,假設應用程序的配置文件可能看起來像這樣:
io_mode = " async "
service "http" "web_proxy" {
listen_addr = " 127.0.0.1:8080 "
process "main" {
command = [ " /usr/local/bin/awesome-app " , " server " ]
}
process "mgmt" {
command = [ " /usr/local/bin/awesome-app " , " mgmt " ]
}
}
JSON等效於此配置:以下內容:
{
"io_mode" : " async " ,
"service" : {
"http" : {
"web_proxy" : {
"listen_addr" : " 127.0.0.1:8080 " ,
"process" : {
"main" : {
"command" : [ " /usr/local/bin/awesome-app " , " server " ]
},
"mgmt" : {
"command" : [ " /usr/local/bin/awesome-app " , " mgmt " ]
},
}
}
}
}
}
無論使用哪種語法,調用應用程序中的API都是相同的。對於更高級的用例,它可以直接與低級屬性和塊一起使用,或者可以使用一個解碼器軟件包來聲明地提取到GO結構或動態值結構。
屬性值可以是表達方式,也可以是文字值:
# Arithmetic with literals and application-provided variables
sum = 1 + addend
# String interpolation and templates
message = " Hello, ${ name } ! "
# Application-provided functions
shouty_message = upper (message)
儘管JSON語法不允許直接使用表達式,但插值語法允許在JSON字符串中使用任意表達式:
{
"sum" : " ${1 + addend} " ,
"message" : " Hello, ${name}! " ,
"shouty_message" : " ${upper(message)} "
}
有關更多信息,請參閱詳細規範:
HCL的2.0版將HCL 1.0的功能與插值語言HIL的功能結合在一起,以產生支持任意表達式的單一配置語言。
這個新版本具有全新的解析器和GO API,沒有直接遷移路徑。儘管語法是相似的,但實現採用了一些非常不同的方法來改進原始實現中存在的一些“粗糙邊緣”,並允許更強大的錯誤處理。
可以使用GO的語義導入版本機制將HCL 1和HCL 2同時導入到同一程序中:
import (
hcl1 "github.com/hashicorp/hcl"
hcl2 "github.com/hashicorp/hcl/v2"
)
HCL受到Vsevolod Stakhov的Libucl的啟發。
HCL和HIL起源於Hashicorp Terraform,Mitchell Hashimoto撰寫的每種解析器。
Fatih Arslan最初的HCL解析器被移植到Pure Go(從YACC)移植。新的本機語法解析器的結構相關部分構建了該作品。
馬丁·阿特金斯(Martin Atkins)將原始的Hil Parser移植到Pure Go(從Yacc)移植。新的本機語法解析器的表達相關部分構建在該作品的基礎上。
HCL 2將原始的HCL和HIL語言融合到了這種單一的新語言中,它基於Martin Atkins在ZCL的設計和原型製作作品。