2019-12-18 09:51:32 -05:00
|
|
|
---
|
|
|
|
layout: guides
|
2019-12-18 09:59:16 -05:00
|
|
|
page_title: Generating code for config spec.
|
2019-12-18 09:57:01 -05:00
|
|
|
sidebar_current: hcl-component-object-spec
|
2019-12-18 09:51:32 -05:00
|
|
|
description: |-
|
|
|
|
Learn how to generate the HCL2 configuration of your component easily.
|
|
|
|
---
|
|
|
|
|
|
|
|
# Auto Generate the HCL2 code of a plugin
|
|
|
|
|
|
|
|
From version 1.5.0 Packer can be configured using HCL2. Because Packer has so
|
|
|
|
many builders, provisioner & post-proessors, we relied on code generation to
|
|
|
|
iterate more easily. The good new is that you can benefit from this code
|
|
|
|
generator to get the HCL2 spec code of your component simply. Is it a Go binary
|
|
|
|
package and is located in `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
|
|
|
|
have most of the code generated:
|
|
|
|
|
|
|
|
* run `go install github.com/hashicorp/packer/cmd/mapstructure-to-hcl2`
|
|
|
|
|
|
|
|
* Add `//go:generate 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 fields of Config are auto generated the same way.
|
|
|
|
|
|
|
|
* Now we only need to make Builder implement the interface by adding the
|
|
|
|
following snippet:
|
|
|
|
|
|
|
|
```go
|
|
|
|
func (b *Builder) ConfigSpec() hcldec.ObjectSpec { return b.config.FlatMapstructure().HCL2Spec() }
|
|
|
|
```
|
|
|
|
|
|
|
|
From now one every time you add or change a field of Config you will need to
|
|
|
|
run he `go generate` command again.
|