packer-cn/website/content/guides/hcl/component-object-spec.mdx
Adrien Delorme 87ba7258b3
Use packer-sdc in packer + remove mapstructure-to-hcl2 & struct-markdown (#10913)
* start using `go:generate packer-sdc struct-markdown`

* Update Makefile

remove @go install ./cmd/struct-markdown

* run go generate for struct-markdown

* use //go:generate packer-sdc mapstructure-to-hcl2

* run go generate for mapstructure-to-hcl2

* remove struct-markdown and mapstructure-to-hcl2

* vendor vendors
2021-04-16 11:52:03 +02:00

43 lines
1.7 KiB
Plaintext

---
page_title: Generating code for config spec.
description: Learn how to generate the HCL2 configuration of your component easily.
---
# Auto Generate the HCL2 code of a plugin
From v1.5, Packer can be configured using HCL2. Because Packer has so many
builders, provisioners, and post-processors, we created a on code generation
tool to add the HCL2-enabling code more easily. You can use this code generator
to create the HCL2 spec code of your custom plugin simply. It's a Go binary
package and is located in
[`cmd/mapstructure-to-hcl2`](https://github.com/hashicorp/packer/tree/master/cmd/mapstructure-to-hcl2).
Say you want to configure the `Config` struct of a `Builder` in a package
located in `my/example-plugin/config.go`. Here are some simple steps you can
follow to make it HCL2 enabled:
- run `go install github.com/hashicorp/packer/cmd/mapstructure-to-hcl2`
- Add `//go:generate packer-sdc mapstructure-to-hcl2 -type Config` at the top of
`config.go`
- run `go generate ./my/example-plugin/...`
This will generate a `my/example-plugin/config.hcl2spec.go` file containing
the configuration fields of `Config`.
- Make sure that all the nested structs of `Config` are also auto generated the
same way.
- Now we only need to make your Builder implement the interface by adding the
following snippet:
```go
func (b *Builder) ConfigSpec() hcldec.ObjectSpec { return b.config.FlatMapstructure().HCL2Spec() }
```
From now on every time you add or change a field of Config you will need to
run the `go generate` command again.
A good example of this is the [Config struct of the amazon-ebs builder](https://github.com/hashicorp/packer-plugin-amazon/blob/main/builder/ebs/builder.go)