I recently submitted a small fix to @chronark’s Vercel provider. The fix itself was pretty trivial, but it took me quite a while to figure out how to actually run Terraform against a local copy of the provider in order to make sure it actually worked. I found the answer eventually in the Terraform CLI documentation.
As a convenience for provider development, Terraform supports a special additional block
dev_overrides
inprovider_installation
blocks.
Let’s assume we have checked out the provider in /Users/dave/Code/terraform-provider-vercel
. To make Terraform use this local copy, create (or edit, if it already exists) a ~/.terraform.rc
file in your home directory, and add the following contents:
provider_installation {
dev_overrides {
“registry.terraform.io/chronark/vercel” = “/Users/dave/Code/terraform-provider-vercel”
}
# For all other providers, install them directly from their origin provider
# registries as normal. If you omit this, Terraform will _only_ use
# the dev_overrides block, and so no other providers will be available.
direct {}
}
Next, go into the provider source folder and compile it, including the version number:
> cd /Users/dave/Code/terraform-provider-vercel
> go build -o terraform-provider-vercel_v0.10.5
When Terraform runs, it will look for a compiled binary under the path you specified in dev_overrides
. If it’s set up properly, you’ll see a warning that you’re running a local copy of the provider:
> terraform apply
╷
│ Warning: Provider development overrides are in effect
│
│ The following provider development overrides are set in the CLI configuration:
│ - chronark/vercel in /Users/dave/Code/terraform-provider-vercel
│
│ The behavior may therefore not match any released version of the provider and applying changes may cause the state to become incompatible with published releases.
If you have an existing ~/.terraform.rc
file that you don’t want to touch, you can create a new config file anywhere you like, and run your Terraform operations prefixed with TF_CLI_CONFIG_FILE=/path/to/the/config/file
instead.