如何在VS Code中配置Terraform代码的对齐和缩进?

11

我使用VS Code开发terraform代码。我的当前terraform插件是:

Name: Terraform
Id: hashicorp.terraform
Description: Syntax highlighting, linting, formatting, and validation for Hashicorp's Terraform
Version: 1.4.0
Publisher: HashiCorp
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform

请考虑以下代码:

output "sql_server" {
  description = "A dictionary of objects containing various Azure Sql Server properties per respective location."
  value = {
    for k, instance in azurerm_sql_server.instance : k =>
    {
      resource_group_name = instance.resource_group_name
      fully_qualified_domain_name = instance.fully_qualified_domain_name 
      name = instance.name
      location = instance.location
      is_primary = instance.location == var.primary_location
      admin_login = instance.administrator_login
    }
  }
}

保存文件时,我希望它被重新格式化为这样:

output "sql_server" {
    description = "A dictionary of objects containing various Azure Sql Server properties per respective location."
    value = {
        for k, instance in azurerm_sql_server.instance : k =>
        {
            resource_group_name         = instance.resource_group_name
            fully_qualified_domain_name = instance.fully_qualified_domain_name 
            name                        = instance.name
            location                    = instance.location
            is_primary                  = instance.location == var.primary_location
            admin_login                 = instance.administrator_login
        }
    }
}

这里有两个步骤:

  • 应用了4个空格的缩进
  • 同一块中的所有赋值都被对齐

网络上有很多关于如何做到这一点的信息,但我可能太蠢了,不能使它起作用,所以我希望得到一个非常具体的答案,其中包含以下细节:

  • 要使用哪个terraform插件
  • 在我的settings.json文件中要写什么

我的当前用户settings.json文件是:

{
    "workbench.startupEditor": "welcomePage",
    "editor.minimap.enabled": false,
    "terminal.integrated.scrollback": 1000,
    "git.enableSmartCommit": true,
    "editor.detectIndentation": false,
    "window.zoomLevel": -1,
    "diffEditor.renderSideBySide": false,
    "extensions.ignoreRecommendations": false,
    "workbench.colorTheme": "PowerShell ISE",
    "powershell.codeFormatting.whitespaceBeforeOpenBrace": false,
    "git.autofetch": true,
    "terminal.integrated.rendererType": "dom",
    "terraform.path": "C:\\Users\\mkharitonov\\.terraform\\terraform.exe"
}

我的本地工作区 settings.json 文件如下:

{
    "git.ignoreLimitWarning": true,
    "powershell.codeFormatting.openBraceOnSameLine": false,
    "powershell.codeFormatting.whitespaceBeforeOpenBrace": false,
    "editor.formatOnPaste": true,
    "editor.formatOnSave": true
}

2
该插件上的自动格式化程序(Ctrl+Shift+i)将运行terraform fmt命令。这是一种基于自己观点的、零选项的自动格式化程序,可以带来规范化的样式。即使它使用2个空格缩进,我也不会偏离这个样式。意见领袖式的自动格式化程序有益处,可以让好的Terraform代码始终保持相同的外观。 - ydaetskcoR
1
赋值的对齐方式怎么样? - mark
1
是的,它会这样做。我建议在代码上运行格式化程序,以便您可以看到它所做的更改。 - ydaetskcoR
哦,我可以放弃4个字符。如果是这样的话,那么我就准备好了,对吧? - mark
插件格式化程序不起作用,我猜这就是为什么我发了这个问题的原因。我记得我曾经使用过这个插件,但没有格式化。我将在插件的 Github 存储库中发布一个错误报告。 - mark
Github问题 - https://github.com/hashicorp/vscode-terraform/issues/393 - mark
8个回答

11

很简单,安装Prettier以及由HashiCorp Terraform制作的扩展程序。

如果需要的话,可以打开VSCode的settings.json文件并添加一个terraform部分。

"[terraform]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "hashicorp.terraform",
    "editor.tabSize": 2, // optionally
  },
  "[terraform-vars]": {
    "editor.tabSize": 2 // optionally
  },

1
我假设这只适用于hashicorp.terraform,如果您也安装了CLI格式化程序?关于查看HashiCorp Terraform输出时,会引发错误:Error for "textDocument/formatting" (ID 27): [-32098] Terraform (CLI) is required. Please install Terraform or make it available in $PATH(Windows操作系统)。 - Metro Smurf
@Metro Smurf 是正确的。只有在我使用 scoop 安装 Terraform 时,格式化文档才有效。 - Pakman

5
建议使用两个空格来编写terraform代码,而不是制表符或四个空格。您可以在Style Conventions中查看。
配置VS Code:
  1. 在您的Mac上安装terraform
  2. 编辑settings.json并添加以下内容:
"[terraform]": {
    "editor.formatOnSave": true
}

在此之后,保存时所有的*.tf文件都将自动格式化。


4
其他答案是正确的并且有效。然而,有一个问题很烦人,就是进行自动保存进程时,4个字符的缩进会被回退到2个字符。
由于某种原因,VSCODE 和 Terraform 插件默认使用4个空格。可以通过在您的 "settings.json" 中添加以下代码块来更改:
    "[terraform]": {
        "editor.tabSize": 2
    },
    "[terraform-vars]": {
        "editor.tabSize": 2
    },

这将在编辑时保持缩进为推荐的2个空格,避免在自动保存文件时从4个空格突然变为2个空格。

4
您可以使用terraform fmt的格式化功能,它会格式化您目录中的所有tf文件并对其进行对齐。在格式化terraform方面,它更易于实现并且更加标准化。有关更多信息,请参见官方文档

2

macOS + VSCode解决方案

如果您在自动格式化方面遇到问题,可以尝试以下方法:

  • Install HashiCorp Terraform plugin

  • Install Terraform version manager:

    brew install tfenv
    
  • Ask tfenv to use the specific version used by your project, for instance:

    tfenv use 0.12.20
    
  • Add the following in your settings.json:

    "[terraform]": {
        "editor.formatOnSave": true
    }
    

1
仍然无法工作,仍提示安装格式化程序。 - Naveen Kumar

0
我不得不添加指向已安装的Terraform二进制文件的路径,所以最终在设置中加入了这个来使其正常工作:
  "terraform.languageServer.terraform.path": "/opt/homebrew/bin/terraform",
  "[terraform]": {
    "editor.defaultFormatter": "hashicorp.terraform",
    "editor.formatOnSave": true,
    "editor.formatOnSaveMode": "file"
  },
  "[terraform-vars]": {
    "editor.defaultFormatter": "hashicorp.terraform",
    "editor.formatOnSave": true,
    "editor.formatOnSaveMode": "file"
  },

0

0
Hashicorp的团队想要解决所有格式问题,因此他们引入了命令terraform fmt,为所有terraform代码提供了标准的格式化。
 terraform fmt [options] [target...]

您可以从他们的选项列表中选择以满足不同的需求,但最有用的一个是:
terraform fmt -recursive

从根目录运行此命令将确保检查和格式化所有子目录中的所有文件。
阅读完整文档:https://developer.hashicorp.com/terraform/cli/commands/fmt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接