By default, builds will run using the latest supported versions of our main tools - Ruby, PHP, Java, Node, Python, Go, .NET, and Composer. However, if you have a project that requires a specific version of one of those tools, you can create your own custom build environment.

## Configuring language versions

Head to **Build Configuration** within your project's **Build Pipeline**, then update any of the main tools at the top of the screen, to use one of the versions provided.

{screenshot: 554}

Once you've done so, future builds in that project will always use those versions of the tools.

{screenshot: 261}

## PHP and Composer versions

PHP and Composer are configured **independently** in **Build Configuration**:

- **PHP** -- pick the major/minor version you need (7.0 through 8.5). The container is shipped with the latest patch release for that version (see the [API language versions reference](Article: #423) for the exact patch number currently bundled).
- **Composer** -- pick Composer 1.x or 2.x. The selected Composer binary runs against the PHP version you've configured for the project, so `composer install` in your build pipeline will automatically use the right PHP.

You don't need to install Composer yourself in your build commands -- it's available on `$PATH` once Build Configuration is saved. If you need an exact Composer patch version that isn't in the dropdown, you can still install it from your build command, for example:

```bash
# Download the installer and verify it against Composer's official signature
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
EXPECTED_HASH="$(php -r 'copy(\"https://composer.github.io/installer.sig\", \"php://stdout\");')"
ACTUAL_HASH="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"
if [ "$EXPECTED_HASH" != "$ACTUAL_HASH" ]; then
  echo "ERROR: Invalid Composer installer signature"
  rm composer-setup.php
  exit 1
fi

php composer-setup.php --install-dir=. --filename=composer --version=2.8.8
php -r "unlink('composer-setup.php');"

./composer install --no-dev --optimize-autoloader
```

## Node.js versions

Node 14.21.3 and above ship `bun` and `pnpm` alongside `npm` and `yarn`. **NVM** (Node Version Manager) 0.40.3 is also available if you need a Node.js version outside the Build Configuration dropdown -- see the [.nvmrc guide](Article: #708) for how to pin Node versions per-project.

## .NET versions

Seven .NET SDK series are available (3.1 through 10.0). If your repo ships a `global.json` at the root, DeployHQ reads `sdk.version` from it and selects the matching series automatically -- so you can pin from your repository instead of from the Build Configuration UI. See [Building .NET applications](Article: building-dotnet-applications) for the full version list, resolution order, and `global.json` behavior.

## Programmatic configuration

If you manage many projects from templates, you can also update language versions via the [DeployHQ API](Article: #423).