HCL เป็นชุดเครื่องมือสำหรับการสร้างภาษาการกำหนดค่าที่มีโครงสร้างซึ่งเป็นทั้งมนุษย์และเป็นมิตรกับเครื่องจักรสำหรับใช้กับเครื่องมือบรรทัดคำสั่ง แม้ว่าโดยทั่วไปจะมีประโยชน์ แต่โดยทั่วไปจะมีการกำหนดเป้าหมายไปยังเครื่องมือ DevOps, เซิร์ฟเวอร์ ฯลฯ เป็นหลัก
หมายเหตุ: นี่เป็นรุ่นใหญ่ที่ 2 ของ HCL ซึ่ง GO API ไม่เข้ากันกับรุ่นหลัก 1 รุ่นทั้งสองรุ่นพร้อมใช้งานสำหรับการเลือกในโครงการโมดูล GO HCL 2 ไม่สามารถ นำเข้าจากโครงการ GO ที่ไม่ได้ใช้โมดูล GO สำหรับข้อมูลเพิ่มเติมดูคู่มือการเลือกเวอร์ชันของเรา
HCL มีทั้ง ไวยากรณ์พื้นเมือง ตั้งใจจะอ่านและเขียนเพื่อมนุษย์และตัวแปรที่ใช้ JSON ซึ่งง่ายกว่าสำหรับเครื่องจักรที่จะสร้างและแยกวิเคราะห์
ไวยากรณ์ของ HCL Native ได้รับแรงบันดาลใจจากการกำหนดค่า LIBUCL, NGINX และอื่น ๆ
มันมีไวยากรณ์นิพจน์ที่อนุญาตการคำนวณแบบอินไลน์พื้นฐานและด้วยการสนับสนุนจากแอปพลิเคชันการโทรการใช้ตัวแปรและฟังก์ชั่นสำหรับภาษาการกำหนดค่าแบบไดนามิกมากขึ้น
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 และรูปแบบการกำหนดค่าที่สร้างขึ้นรอบ ๆ ภาษาการเขียนโปรแกรมเต็มรูปแบบเช่นทับทิม ไวยากรณ์ 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)} "
}
สำหรับข้อมูลเพิ่มเติมดูข้อมูลจำเพาะโดยละเอียด:
เวอร์ชัน 2.0 ของ HCL รวมคุณสมบัติของ HCL 1.0 เข้ากับ HIL ภาษาการแก้ไขเพื่อสร้างภาษาการกำหนดค่าเดียวที่รองรับการแสดงออกโดยพลการ
เวอร์ชันใหม่นี้มีตัวแยกวิเคราะห์ใหม่และ GO API ใหม่โดยไม่มีเส้นทางการย้ายถิ่นโดยตรง แม้ว่าไวยากรณ์จะคล้ายกัน แต่การใช้งานใช้วิธีการที่แตกต่างกันมากในการปรับปรุง "ขอบขรุขระ" บางอย่างที่มีอยู่กับการใช้งานดั้งเดิมและเพื่อให้การจัดการข้อผิดพลาดที่แข็งแกร่งยิ่งขึ้น
เป็นไปได้ที่จะนำเข้าทั้ง HCL 1 และ HCL 2 ไปยังโปรแกรมเดียวกันโดยใช้กลไก การกำหนดเวอร์ชันการนำเข้าความหมาย ของ GO:
import (
hcl1 "github.com/hashicorp/hcl"
hcl2 "github.com/hashicorp/hcl/v2"
)
HCL ได้รับแรงบันดาลใจอย่างมากจาก Libucl โดย Vsevolod Stakhov
HCl และ Hil เกิดขึ้นใน Hashicorp Terraform พร้อมตัวแยกวิเคราะห์ดั้งเดิมสำหรับแต่ละคนที่เขียนโดย Mitchell Hashimoto
ตัวแยกวิเคราะห์ HCl ดั้งเดิมถูกส่งไปยัง Pure Go (จาก YACC) โดย Fatih Arslan ส่วนที่เกี่ยวข้องกับโครงสร้างของตัวแยกวิเคราะห์ไวยากรณ์ดั้งเดิมสร้างขึ้นบนงานนั้น
ตัวแยกวิเคราะห์ Hil ดั้งเดิมถูกส่งไปยัง Pure Go (จาก YACC) โดย Martin Atkins ส่วนที่เกี่ยวข้องกับการแสดงออกของตัวแยกวิเคราะห์ไวยากรณ์ดั้งเดิมสร้างขึ้นในงานนั้น
HCL 2 ซึ่งรวมภาษา HCL และ HIL ดั้งเดิมเข้ากับภาษาใหม่นี้สร้างจากการออกแบบและการสร้างต้นแบบโดย Martin Atkins ใน ZCL