HCL은 명령 줄 도구와 함께 사용하기 위해 인간적이고 기계 친화적 인 구조화 된 구성 언어를 작성하기위한 툴킷입니다. 일반적으로 유용하지만 주로 DevOps 도구, 서버 등을 대상으로합니다.
참고 : 이것은 GO API가 주요 버전 1과 호환되지 않는 HCL의 주요 버전 2입니다. 두 버전 모두 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은 다른 소프트웨어 사이의 상호 운용성을위한 Lingua Franca 로 매우 편리하다는 것은 부인할 수 없습니다. 이로 인해 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의 기능과 보간 언어의 기능을 결합하여 임의의 표현을 지원하는 단일 구성 언어를 생성합니다.
이 새로운 버전에는 직접 마이그레이션 경로가없는 완전히 새로운 파서와 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가 작성한 각각의 원래 파서가 있습니다.
원래 HCl 파서는 Fatih Arslan에 의해 Pure Go (YACC)로 포팅되었습니다. 새로운 기본 구문 파서의 구조 관련 부분은 해당 작업을 구축합니다.
원래의 힐 파서는 Martin Atkins에 의해 Pure Go (YACC)로 포팅되었습니다. 새로운 기본 구문 파서의 표현 관련 부분은 해당 작업을 구축합니다.
원래 HCL 및 HIL 언어를이 단일 새로운 언어로 병합 한 HCL 2는 ZCL의 Martin Atkins의 디자인 및 프로토 타이핑 작업을 바탕으로합니다.