---
title: Global Hooks
---

Some builds may need pre-build steps before building, e.g. `go generate`.
The `before` section allows for global hooks which will be executed before
the build is started.

The configuration is very simple, here is a complete example:

```yaml
# .goreleaser.yml
before:
  # Templates for the commands to be ran.
  hooks:
  - make clean
  - go generate ./...
  - go mod tidy
  - touch {{ .Env.FILE_TO_TOUCH }}
```

If any of the hooks fails the build process is aborted.

## Complex commands

If you need to do anything more complex, it is recommended to create a shell script and call it instead.
You can also go crazy with `sh -c "my commands"`, but it gets ugly real fast.


## Pro Features

With [GoReleaser Pro](/pro/), things are a bit more flexible: you can specify the dir, environment variables and also global after hooks.

```yaml
# .goreleaser.yml

# global before hooks
before:
  # Templates for the commands to be ran.
  hooks:
  - make clean # simple string
  - cmd: go generate ./... # specify cmd
  - cmd: go mod tidy
    dir: ./submodule # specify command working directory
  - cmd: touch {{ .Env.FILE_TO_TOUCH }}
    env:
      FILE_TO_TOUCH: 'something-{{ .ProjectName }}' # specify hook level environment variables

# global after hooks
after:
  # Templates for the commands to be ran.
  hooks:
  - make clean
  - cmd: cat *.yaml
    dir: ./submodule
  - cmd: touch {{ .Env.RELEASE_DONE }}
    env:
      RELEASE_DONE: 'something-{{ .ProjectName }}' # specify hook level environment variables
```

!!! info
    Global after hooks is a [GoReleaser Pro feature](/pro/).

!!! tip
    Learn more about the [name template engine](/customization/templates/).