[CmdletBinding()] param( [Parameter(Mandatory)] [string]$GameDir, [string]$VersionConfig, [string]$PackageVersion, [string]$OutputDirectory ) $ErrorActionPreference = 'Stop' if (-not $VersionConfig) { $VersionConfig = Join-Path $PSScriptRoot '..\..\versions.json' } if (-not $OutputDirectory) { $OutputDirectory = Join-Path $PSScriptRoot '..\..\.build\nuget' } $repository = [IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..')) $versions = Get-Content -LiteralPath $VersionConfig -Raw | ConvertFrom-Json if (-not $PackageVersion) { [xml]$metadata = Get-Content -LiteralPath (Join-Path $PSScriptRoot '..\PackageMetadata.props') -Raw $PackageVersion = "$($metadata.Project.PropertyGroup.BD2PackageVersion)-game.$($versions.game_version)" } if ($PackageVersion -notmatch '^\d+\.\d+\.\d+-game\.\d+\.\d+\.\d+(?:\.[A-Za-z0-9-]+)*$') { throw 'PackageVersion must be SemVer with game version, for example 0.2.1-game.2.35.10.' } if ($PackageVersion -notmatch ('-game\.' + [regex]::Escape([string]$versions.game_version) + '(?:\.|$)')) { throw 'PackageVersion game suffix must match VersionConfig game_version.' } $OutputDirectory = [IO.Path]::GetFullPath($OutputDirectory) $staging = Join-Path $repository ".build\nuget-staging\$PackageVersion" $sdk = Join-Path $staging 'sdk' $tool = Join-Path $staging 'tool' $runtimeObj = Join-Path $staging 'runtime-obj' $runtimeBin = Join-Path $staging 'runtime-bin' $packageObj = Join-Path $staging 'package-obj' $packageBin = Join-Path $staging 'package-bin' New-Item -ItemType Directory -Force -Path $OutputDirectory, $staging | Out-Null function Invoke-Dotnet([string[]]$Arguments) { & dotnet @Arguments if ($LASTEXITCODE -ne 0) { throw "dotnet failed with exit code $LASTEXITCODE" } } $toolVersion = $PackageVersion.Split('-')[0] Invoke-Dotnet @('publish', (Join-Path $PSScriptRoot 'GameSdk.csproj'), '-c', 'Release', '--nologo', '-o', $tool, "-p:Version=$toolVersion", '-p:UseAppHost=false') $assembly = Join-Path $GameDir 'BrownDust II_Data\Managed\Assembly-CSharp.dll' $toolDll = Join-Path $tool 'GameSdk.dll' Invoke-Dotnet @($toolDll, 'prepare-embedded', $assembly, $sdk, $VersionConfig) $table = Join-Path $sdk 'names.json' $runtimeProject = Join-Path $PSScriptRoot '..\GameNames\GameNames.csproj' Invoke-Dotnet @('pack', $runtimeProject, '-c', 'Release', '--nologo', '-o', $OutputDirectory, "-p:Version=$PackageVersion", "-p:GameNamesTable=$table", "-p:BaseIntermediateOutputPath=$runtimeObj/", "-p:OutputPath=$runtimeBin/") Invoke-Dotnet @($toolDll, 'verify-runtime', $table, (Join-Path $runtimeBin 'BD2.GameNames.dll')) $packageProject = Join-Path $PSScriptRoot 'Package\BD2.GameSdk.Package.csproj' $nugetConfig = Join-Path $staging 'NuGet.Config' $escapedSource = [Security.SecurityElement]::Escape($OutputDirectory) [IO.File]::WriteAllText($nugetConfig, "") Invoke-Dotnet @('restore', $packageProject, '--configfile', $nugetConfig, "-p:Version=$PackageVersion", '-p:BD2Packaging=true', "-p:BaseIntermediateOutputPath=$packageObj/", "-p:OutputPath=$packageBin/") Invoke-Dotnet @('pack', $packageProject, '-c', 'Release', '--no-restore', '--nologo', '-o', $OutputDirectory, "-p:Version=$PackageVersion", "-p:BD2ToolPublishDir=$tool", '-p:BD2Packaging=true', "-p:BaseIntermediateOutputPath=$packageObj/", "-p:OutputPath=$packageBin/") Write-Host "Created BD2.GameNames and BD2.GameSdk $PackageVersion in $OutputDirectory"