--- layout: "docs" --- # Developing Plugins This page will document how you can develop your own Packer plugins. Prior to reading this, it is assumed that you're comfortable with Packer and also know the [basics of how Plugins work](/docs/extend/plugins.html), from a user standpoint. Packer plugins must be written in [Go](http://golang.org/), so it is also assumed that you're familiar with the language. This page will not be a Go language tutorial. Thankfully, if you are familiar with Go, the Go toolchain makes it extremely easy to develop Packer plugins.
import ( "github.com/mitchellh/packer/plugin" ) // Assume this implements packer.Builder type Builder struct{} func main() { plugin.ServeBuilder(new(Builder)) }**That's it!** `plugin.ServeBuilder` handles all the nitty gritty of communicating with Packer core and serving your builder over RPC. It can't get much easier than that. Next, just build your plugin like a normal Go application, using `go build` or however you please. The resulting binary is the plugin that can be installed using standard installation procedures. The specifics of how to implement each type of interface are covered in the relevant subsections available in the navigation to the left. ## Logging and Debugging Plugins can use the standard Go `log` package to log. Anything logged using this will be available in the Packer log files automatically. The Packer log is visible on stderr when the `PACKER_LOG` environmental is set. Packer will prefix any logs from plugins with the path to that plugin to make it identifiable where the logs come from. Some example logs are shown below: ``` 2013/06/10 21:44:43 ui: Available commands are: 2013/06/10 21:44:43 Loading command: build 2013/06/10 21:44:43 packer-command-build: 2013/06/10 21:44:43 Plugin minimum port: 10000 2013/06/10 21:44:43 packer-command-build: 2013/06/10 21:44:43 Plugin maximum port: 25000 2013/06/10 21:44:43 packer-command-build: 2013/06/10 21:44:43 Plugin address: :10000 ``` As you can see, the log messages from the "build" command plugin are prefixed with "packer-command-build". Log output is _extremely_ helpful in debugging issues and you're encouraged to be as verbose as you need to be in order for the logs to be helpful. ## Plugin Development Tips Here are some tips for developing plugins, often answering common questions or concerns. First, it is standard practice to name the resulting plugin application in the format of `packer-TYPE-NAME`. For example, if you're building a new builder for CustomCloud, it would be standard practice to name the resulting plugin `packer-builder-custom-cloud`. This naming convention helps users identify the purpose of a plugin. Next, while developing plugins, you can configure your Packer configuration to point directly to the compiled plugin in order to test it. For example, building the CustomCloud plugin, I may configure packer like so:
{ "builders": { "custom-cloud": "/an/absolute/path/to/packer-builder-custom-cloud" } }This would configure Packer to have the "custom-cloud" plugin, and execute the binary that I am building during development. This is extremely useful during development. Additionally, it is recommended you use a tool like [goxc](https://github.com/laher/goxc) in order to cross-compile your plugin for every platform that Packer supports, since Go applications are platform-specific. goxc will allow you to build for every platform from your own computer.