Set-DevDriveCache.ps1

function Set-DevDriveCache {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory, HelpMessage = 'Path to the dev drive.')]
        [ValidateScript({ Test-Path $_ })]
        [string]$Path
    )

    Write-Verbose 'Configuring dev drive caches'

    $basePath = Join-Path $Path 'packages'
    New-Item -Path $basePath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null

    #region JavaScript & TypeScript
    $npmPath = Join-Path $basePath 'npm'
    Write-Verbose "Setting npm cache to $npmPath"
    New-Item -Path $npmPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('npm_config_cache', $npmPath, [EnvironmentVariableTarget]::User)

    $yarnPath = Join-Path $basePath 'yarn'
    Write-Verbose "Setting Yarn cache to $yarnPath"
    New-Item -Path $yarnPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('YARN_CACHE_FOLDER', $yarnPath, [EnvironmentVariableTarget]::User)
    [Environment]::SetEnvironmentVariable('YARN_ENABLE_GLOBAL_CACHE', 'true', [EnvironmentVariableTarget]::User)
    #endregion

    #region .NET
    $nugetPath = Join-Path $basePath 'nuget'
    Write-Verbose "Setting NuGet cache to $nugetPath"
    New-Item -Path $nugetPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('NUGET_PACKAGES', $nugetPath, [EnvironmentVariableTarget]::User)
    #endregion

    #region C & C++
    $vcpkgPath = Join-Path $basePath 'vcpkg'
    Write-Verbose "Setting Vcpkg cache to $vcpkgPath"
    New-Item -Path $vcpkgPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('VCPKG_DEFAULT_BINARY_CACHE', $vcpkgPath, [EnvironmentVariableTarget]::User)
    #endregion

    #region Python
    $pipPath = Join-Path $basePath 'pip'
    Write-Verbose "Setting pip cache to $pipPath"
    New-Item -Path $pipPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('PIP_CACHE_DIR', $pipPath, [EnvironmentVariableTarget]::User)

    $poetryPath = Join-Path $basePath 'poetry'
    Write-Verbose "Setting Poetry cache to $poetryPath"
    New-Item -Path $poetryPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('POETRY_CACHE_DIR', $poetryPath, [EnvironmentVariableTarget]::User)

    $uvPath = Join-Path $basePath 'uv'
    Write-Verbose "Setting uv cache to $uvPath"
    New-Item -Path $uvPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('UV_CACHE_DIR', $uvPath, [EnvironmentVariableTarget]::User)
    #endregion

    #region Rust
    $cargoPath = Join-Path $basePath 'cargo'
    Write-Verbose "Setting Cargo cache to $cargoPath"
    New-Item -Path $cargoPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('CARGO_HOME', $cargoPath, [EnvironmentVariableTarget]::User)
    #endregion

    #region Java
    $mavenPath = Join-Path $basePath 'maven'
    Write-Verbose "Setting Maven cache to $mavenPath"
    New-Item -Path $mavenPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
    [Environment]::SetEnvironmentVariable('MAVEN_OPTS', "-Dmaven.repo.local=$mavenPath", [EnvironmentVariableTarget]::User)
    #endregion
}