# Build constraints and vendoring

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com/help/idea/llms.txt).

Build constraints and vendoring mode are tools you can use to fine-tune your build process. With build constraints, you define rules that determine which files are included in the package. By enabling vendoring mode, you ensure your application is built only with dependency packages stored within your project. This approach allows you to include a specific set of files in your package and use dependencies that you have locally modified or patched.

## Build constraints

A build constraint, also known as a build tag, is a line comment that outlines the conditions under which a file is included in the package. These tags can specify requirements such as the operating system, architecture, Go version, compiler, cgo support, or other target system needs. In the example below, we declare that this file is for the target system meeting the following criteria:

* `// +build darwin,cgo linux` is the older syntax for build tags, still recognized in Go. It specifies two sets of conditions: * `darwin,cgo`: Include in the build when compiling for the `darwin` platform (macOS) and when `cgo` is enabled. `cgo` enables the inclusion of C code in Go programs. * `linux`: Include when compiling for the Linux platform. The space acts as an OR operator, meaning the file should be included for macOS with cgo enabled or for Linux.

* `//go:build (darwin && cgo) || linux` is the newer syntax for build tags, introduced in Go 1.17, using a more explicit boolean expression format: * `(darwin && cgo) || linux`: The file should be included in the build for macOS with cgo enabled or for Linux, identical to the above condition.

![Build constraints](https://resources.jetbrains.com/help/img/idea/2026.2/go_example_build_constraints.png)

IntelliJ IDEA can use these constraints to decide what files must be ignored during validation, resolving, and symbol suggestions. If the file does not satisfy the requirements of the target system, IntelliJ IDEA displays a notification. For example, the following conditions on the screenshot will conflict with settings from [the Configure build constraints for your project procedure](#configure-build-constraints-for-your-project).

![Notification about build constraints](https://resources.jetbrains.com/help/img/idea/2026.2/go_example_build_constraints_invalid.png)

Procedure: Configure build constraints for your project

The `go build` command in Go [supports](https://pkg.go.dev/cmd/go) the use of custom tags through the `-tags` argument to conditionally compile files based on build constraints. These tags allow you to specify conditions under which files are included in the build process.

In your Go source files, you can define build constraints by placing a comment at the top of the file that includes the `// +build` or `//go:build` directive followed by the custom tags.

1. Open settings (`Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS))) and navigate to `Languages & Frameworks | Go | Build Tags`.

2. From drop-down lists, select expected values for the target system. If you have any custom tags, specify them in the Custom tags field (use a space between tags as a separator).

3. Click OK.

![Configure build constraints for your project](https://resources.jetbrains.com/help/img/idea/2026.2/go_configure_project_build_contraints.png)

Procedure: Using Go experiments

1. Open settings by pressing `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS)) and navigate to `Go | Build Tags`.

2. Type tags for Go Experiments in one of the fields:

* Custom tags: type tags in the following format: `goexperiment.rangefunc goexperiment.loopvar`. Use spaces to separate tags from each other.

* Experiments: type tags in the following format: `rangefunc, loopvar`. Use commas to separate tags from each other.

Tag names are located within the corresponding packages. For instance, upon accessing the `iter` package, you will notice the tag name directly following the `go:build` tag. Specifically for the `iter` package, the tag is `goexperiment.rangefunc`. In the Custom tags field, enter the complete tag, whereas in the Experiments field, input only the segment subsequent to `goexperiment.`.

### Description of Build Tags fields

For more information about build tags or constraints, see [Build constraints at pkg.go.dev](https://pkg.go.dev/cmd/go#hdr-Build_constraints).

| Field | Values | Description |
| --- | --- | --- |
| Operating System | `linux`, `windows` | Selects the target operating system. The IDE passes the selected value to Go as `GOOS`. |
| Architecture | `amd64`, `arm64` | Selects the target CPU architecture. The IDE passes the selected value to Go as `GOARCH`. |
| Go Version | `go1.N` | Matches Go releases at or after the specified version. For example, `go1.22` matches Go 1.22 and later. |
| Compiler | `gc`, `gccgo` | Selects a compiler when it is available. |
| CGO Support | `cgo`, `!cgo` | Matches whether cgo support is enabled. The IDE passes the selected setting to Go as `CGO_ENABLED`. |
| Custom Tags | Custom tag names | Matches custom tags introduced by the `//go:build` comment line.     For example, in the following screenshot, the `goexperiment.rangefunc` build tag enables iteration over a function from [Go Experiments](https://pkg.go.dev/internal/goexperiment).     |
| Experiments | Experiment names | Enables or disables Go toolchain experiments. The IDE passes the selected values to Go as `GOEXPERIMENT`. |

### Using multiple conditions for build constraints

The following table compares the legacy and current build constraint syntax when a condition uses AND and OR.

| `// +build` | `//go:build` |
| --- | --- |
|  ``` // +build darwin,cgo linux ```     A comma (as a logical And) and a whitespace (as a logical Or)    |  ``` //go:build (darwin && cgo) \|\| linux ```     The `&&` operator (logical `And`) and the `\|\|` operator (logical `Or`)    |

## Vendoring

With the vendoring mode enabled, you build your application only with dependency packages that are stored inside your project under the `vendor` directory. In this mode, Go commands ignore dependency descriptions in `go.mod` and assume that the `vendor` directory holds the correct copies of dependencies. By default, when you use Go modules, the `vendor` directory is ignored during the build.

In Go 1.14 RC, automatic vendoring mode became a built-in Go feature. Starting from Go 1.14 RC, IntelliJ IDEA also enables automatic vendoring mode by default. You can disable vendoring per project, for example, when you have a monorepo containing the `vendor` folder used by another language.

You can control automatic vendoring by using the Enable vendoring support automatically checkbox. When the checkbox is selected, automatic vendoring is enabled. So, if you add the `vendor` directory to the module, the IDE uses it. If you remove the directory, IntelliJ IDEA uses the global Go Modules cache.

Procedure: Toggle vendoring mode

1. Press `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS)) to open settings and then select `Languages & Frameworks | Go | Go Modules`.

2. Clear or select the Enable vendoring support automatically checkbox and click OK.

