ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Universal Ctags 解析 Terraform:Terraform 与 TerraformVariables 两个解析器实战指南

Universal Ctags 解析 Terraform:Terraform 与 TerraformVariables 两个解析器实战指南 开发工具CLI【免费下载链接】ctagsA maintained ctags implementation项目地址https://gitcode.com/gh_mirrors/ct/ctags点击查看免费下载本文基于 Universal Ctags 仓库中的ctags-lang-terraform(7)手册页系统讲解如何用 Universal Ctags 为 TerraformHCL配置与*.tfvars变量定义文件生成 tags涵盖解析器启用方式、kind/role 体系、local与assigned等新特性以及正则表驱动的实现原理。导读Terraform 是 HashiCorp 出品的 IaC基础设施即代码工具其配置以 HCL 语法书写在*.tf文件中变量赋值则常放在*.tfvars变量定义文件中。Universal Ctags 为此内置了两个专用解析器Terraform与TerraformVariables。前者为*.tf主文件建立资源、数据源、变量、Provider、模块、输出、locals 等对象的索引后者则专门从*.tfvars文件中提取被赋值的变量并以assigned角色挂到Terraform语言的variablekind 之下。读完本文你将掌握如何启用这两个解析器、如何通过--extras{reference}提取.tfvars中的变量赋值、Terraform语言完整的 kind/role 清单以及这两个解析器在源码与测试用例中的真实行为。SYNOPSIS快速启用 Terraform 解析手册页给出了三条最基本的命令行形式。第一条是按语言名显式开启解析器ctags ... --languagesTerraform ...第二条是对输入文件强制使用 Terraform 解析器即使扩展名不匹配ctags ... --language-forceTerraform ...第三条是为特定扩展名追加映射让.tf后缀归属于Terraform虽然默认已映射但可显式声明ctags ... --map-Terraform.tf ...对于.tfvars变量定义文件需要同时打开reference扩展项并启用TerraformVariables解析器。手册页给出了与之对应的三条等价命令ctags ... --extras{reference} --languagesTerraformVariables ... ctags ... --extras{reference} --language-forceTerraformVariables ... ctags ... --extras{reference} --map-Terraform.tfvars ...说明--languagesX是在原默认语言集合基础上追加 X--language-forceX忽略扩展名猜测一律按 X 解析--map-X.ext为语言 X 追加扩展名映射表示追加而非覆盖。默认情况下.tf已映射到Terraform、.tfvars已映射到TerraformVariables上述命令更多用于在语言被禁用或扩展名被覆盖时恢复行为。DESCRIPTION两个解析器的分工本手册页是对 Terraform 文件 tagging 的随机笔记式汇总。核心信息是Terraform解析器负责*.tf主文件TerraformVariables解析器负责*.tfvars变量定义文件二者通过语言角色机制衔接——后者的产出以assigned角色登记为Terraform语言的variablekind。这一分工在源码中体现得很直接。解析器的定义文件位于 optlib/terraform.ctags 与 optlib/terraformvariables.ctags对应生成的 C 代码为 optlib/terraform.c 与 optlib/terraformvariables.c。从 terraform.ctags 的注释可以看到该解析器由 Julio Tain Sueiras 与 Antony Southworth 贡献正则源于vim-terraform-completion项目多行正则表multi-table regex被重新实现以支持多行注释与locals块语言名从terraform改为tf便于 Vim 依据*.tf扩展名识别.tfvars相关的代码被迁移到独立的TerraformVariables解析器。语言定义与扩展名映射Terraform语言的定义带版本号1.1并将.tf扩展名映射进来--langdefTerraform{version1.1} --map-Terraform.tfTerraformVariables则被声明为一个外国语言foreign language归属到Terraform并映射.tfvars扩展名--langdefTerraformVariables{_foreignLanguageTerraform} --map-TerraformVariables.tfvars这里_foreignLanguageTerraform意味着TerraformVariables本身没有独立的对象体系它产出的 tag 会被归并到Terraform语言下从而与*.tf中的variable定义形成完整闭环。Kinds 与 RolesTerraform 的对象模型Terraform解析器定义了 7 种 kind见 optlib/terraform.ctags字母名称说明rresource资源块如resource aws_cloudwatch_event_bus xddata数据源块如data aws_ssm_parameter xvvariable输入变量定义如variable xpproviderProvider 块如provider awsmmodule模块调用如module databaseooutput输出值如output passwordllocallocals块内的局部变量自版本 1 起引入其中local是手册页 VERSIONS 一节明确记载的新增 kindChange since 0.0 — New kindlocal。它由版本门控语法{version1}标记--kinddef-Terraforml,local,locals{version1}而variablekind 附带了一个角色定义--_roledef-Terraform.vassigned,assigned in Variable Definitions (.tfvars) files即variable拥有assigned角色语义为在 Variable Definitions (.tfvars) 文件中被赋值。这正是TerraformVariables解析器产出的 tag 所使用的角色--regex-TerraformVariables/^([a-z0-9_])[[:space:]]*/\1/v/{_roleassigned}{_languageTerraform}该正则匹配行首的标识符[a-z0-9_]后跟空白和提取为Terraform语言variablekind 的 tag并打上assigned角色。TIPS提取 .tfvars 中的变量赋值手册页给出的实战技巧是指定--extras{reference}与--languagesTerraformVariables即可提取*.tfvars变量定义文件中被赋值的变量。这些变量以Terraform语言的variablekind、assigned角色被登记。reference扩展项extras的作用是输出引用型对象——即那些在定义文件之外被引用/赋值、本身并非定义的对象。若不开启--extras{reference}TerraformVariables产出的assigned记录会被过滤掉开启后才会出现在输出中。仓库中的测试用例 Units/parser-terraform.r/simple-terraform.d 完整演示了这一场景。其args.ctags配置为--sortno --extrasr --fieldsrl即关闭排序、开启 reference 扩展项、输出 roles 与 language 字段。输入文件 input.tf 定义了 provider、variable、resource、module、data、output 与 locals而 input-0.tfvars 只有一行events_bus_name hyper-connector最终 expected.tags 的输出同时包含两类记录其中.tfvars的赋值被明确标记为assignedaws input.tf /^provider aws {$/; p language:Terraform roles:def events_bus_name input.tf /^variable events_bus_name {$/; v language:Terraform roles:def example_events_bus input.tf /^resource aws_cloudwatch_event_bus example_events_bus {$/; r language:Terraform roles:def database input.tf /^module database {$/; m language:Terraform roles:def example_database_password input.tf /^data aws_ssm_parameter example_database_password {$/; d language:Terraform roles:def password input.tf /^output password {$/; o language:Terraform roles:def this_is_a_local_variable_1 input.tf /^ this_is_a_local_variable_1 this is the value of local variable 1$/; l language:Terraform roles:def this_is_a_local_variable_2 input.tf /^ this_is_a_local_variable_2 var.events_bus_name local.this_is_a_local_variable_1 ## var.ev/; l language:Terraform roles:def events_bus_name input-0.tfvars /^events_bus_name hyper-connector$/; v language:Terraform roles:assigned可以看到*.tf中的定义型对象 role 为def而*.tfvars中的赋值型对象 role 为assigned二者的language字段均为Terraform印证了TerraformVariables作为外国语言向Terraform归并的设计。实现原理多表正则mtable驱动的解析器Terraform解析器不是 C 语言手写解析器而是完全由 optlib 正则表mtable声明式定义。从 optlib/terraform.ctags 可见它声明了 4 张状态表--_tabledef-Terraformtoplevel --_tabledef-Terraformcomment --_tabledef-Terraformlocals --_tabledef-Terraformmulticommenttoplevel顶层状态通过行首锚定^的规则匹配 resource/data/variable/provider/module/output 等块头也处理locals {进入 locals 状态。comment单行注释状态匹配#与//开头的行遇到换行返回顶层。multicomment块注释状态匹配/* ... */遇到*/返回。localslocals 块状态逐行提取key value形式的局部变量名并处理嵌套块与注释。关键规则摘录如下--_mtable-regex-Terraformtoplevel/^resource[[:space:]]([^])[[:space:]]([^])/\2/r/ --_mtable-regex-Terraformtoplevel/^data[[:space:]]([^])[[:space:]]([^])/\2/d/ --_mtable-regex-Terraformtoplevel/^variable[[:space:]]([^])/\1/v/ --_mtable-regex-Terraformtoplevel/^provider[[:space:]]([^])/\1/p/ --_mtable-regex-Terraformtoplevel/^module[[:space:]]([^])/\1/m/ --_mtable-regex-Terraformtoplevel/^output[[:space:]]([^])/\1/o/注意 resource 与 data 的规则提取的是第二个引号内的名称\2即用户自定义的资源名/数据源名而类型名如aws_cloudwatch_event_bus不进入 tag 名。locals状态的提取规则--_mtable-regex-Terraformlocals/([a-z0-9_])[[:space:]]*[[:space:]]/\1/l/这套多表设计解决了两个经典难题一是/* ... */多行注释中的伪定义不会被误报二是locals块内部的变量不会与顶层variable混淆。测试输入 input.tf 特意在#、//注释与/* */块注释中埋入了variable dont_extract_me0、resource ... no_parse_*等陷阱expected.tags 中没有任何一条此类记录说明注释状态表正确地屏蔽了它们。测试套件从简单到专项仓库 Units/parser-terraform.r 目录下按场景拆分了多个测试用例用例目录验证要点simple-terraform.d全类型综合 .tfvars的assigned角色resource.dresourcekind 的提取data.ddatakind 的提取variable.dvariablekind 的提取provider.dproviderkind 的提取module.dmodulekind 的提取output.doutputkind 的提取local.dlocalkind 的提取以 local.d/expected.tags 为例输出确认了lkindthis_is_a_local_variable_1 input.tf /^ this_is_a_local_variable_1 this is the value of local variable 1$/; lvariable.d/expected.tags 则验证了vkindevents_bus_name input.tf /^variable events_bus_name {$/; v这些测试文件与 optlib/terraform.ctags 一一对应是排查解析行为、验证新 kind/role 的首选入口。VERSIONS版本演进手册页的 VERSIONS 一节记录了相对于0.0的变更新增 kindlocal为locals { ... }块内的局部变量建立索引由--kinddef-Terraforml,local,locals{version1}声明受语言版本1.1门控。当前Terraform语言定义版本为1.1见--langdefTerraform{version1.1}TerraformVariables则由 2023 年 Masatake YAMATO 与 Red Hat 的贡献引入见 optlib/terraformvariables.ctags 头部版权注释。SEE ALSO延伸阅读ctags(1) 主手册全部命令行选项与输出格式的权威说明Terraform 官方《Configuration Syntax》HCL 配置语法Terraform 官方《Variable Definitions (.tfvars) Files》变量定义文件格式。在仓库内还可以直接阅读optlib/terraform.ctagsTerraform解析器完整定义optlib/terraformvariables.ctagsTerraformVariables解析器完整定义Units/parser-terraform.r覆盖全部 kind 与.tfvars场景的测试集man/ctags-lang-terraform.7.rst.in本手册页的模板源文件构建时以实际版本号填充VERSION。赞分享开发工具CLI【免费下载链接】ctagsA maintained ctags implementation项目地址https://gitcode.com/gh_mirrors/ct/ctags点击查看免费下载相关推荐Universal Ctags 6.0.0 版本解析新选项、新解析器与 readtags 增强实战指南Universal Ctags 6.0.0 版本解析新选项、新解析器与 readtags 增强实战指南 本文以 Universal Ctags本仓库即其维护开发工具CLIUniversal Ctags 的 Lex/flex 语言解析器ctags-lang-lex 使用指南与实现剖析Universal Ctags 的 Lex/flex 语言解析器ctags lang lex 使用指南与实现剖析 导读 本文围绕 Universal Cta开发工具CLITripoSR 手把手实战一张 2D 图片 3 条命令变成带纹理的 3D 模型TripoSR 手把手实战一张 2D 图片 3 条命令变成带纹理的 3D 模型 TripoSR 是 Tripo AI 与 Stability AI 联合推出的开发工具CLI上一篇告别Flaky TestsAndroid Espresso测试从入门到精通的实战指南下一篇ZjDroid实战指南基于Xposed的Android动态逆向分析平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表