From 655c79cc7c14bb417d63576d0899eb1481307570 Mon Sep 17 00:00:00 2001 From: jessikitty Date: Wed, 22 Apr 2026 09:56:20 +1000 Subject: [PATCH] Simplify HintPath resolution - regex replaces ALL paths to Disco bin --- Build-Plugin.ps1 | 75 +++++++++++++----------------------------------- 1 file changed, 20 insertions(+), 55 deletions(-) diff --git a/Build-Plugin.ps1 b/Build-Plugin.ps1 index 5b5cb7a..06caf80 100644 --- a/Build-Plugin.ps1 +++ b/Build-Plugin.ps1 @@ -3,9 +3,6 @@ # # Usage: # .\Build-Plugin.ps1 -DiscoBinPath "C:\Program Files\Disco\WebApp\bin" -# -# Or if you have the Disco source solution built: -# .\Build-Plugin.ps1 -DiscoBinPath "C:\Source\Disco\Disco.Web\bin" param( [Parameter(Mandatory=$true)] @@ -21,7 +18,7 @@ $PluginName = "Disco.Plugins.ADCompare" Write-Host "=== AD Compare Plugin Builder ===" -ForegroundColor Cyan Write-Host "Disco bin path: $DiscoBinPath" -ForegroundColor Gray -# --- Validate Disco bin path and required DLLs --- +# --- Validate --- if (-not (Test-Path $DiscoBinPath)) { Write-Error "Disco bin path not found: $DiscoBinPath" exit 1 @@ -31,7 +28,7 @@ $requiredDlls = @("Disco.Services.dll", "Disco.Models.dll", "Disco.Data.dll") foreach ($dll in $requiredDlls) { $dllPath = Join-Path $DiscoBinPath $dll if (-not (Test-Path $dllPath)) { - Write-Error "Required assembly not found: $dllPath`nMake sure '$DiscoBinPath' contains the Disco assemblies." + Write-Error "Required assembly not found: $dllPath" exit 1 } } @@ -39,52 +36,31 @@ Write-Host "All required Disco assemblies found" -ForegroundColor Green # --- Find MSBuild --- $msbuild = $null - -# Try VS2022/2019 via vswhere $vsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" if (Test-Path $vsWhere) { $msbuild = & $vsWhere -latest -requires Microsoft.Component.MSBuild -find "MSBuild\**\Bin\MSBuild.exe" 2>$null | Select-Object -First 1 } - -# Try .NET Framework MSBuild if (-not $msbuild -or -not (Test-Path $msbuild)) { - $frameworkMSBuild = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" - if (Test-Path $frameworkMSBuild) { - $msbuild = $frameworkMSBuild - } + $msbuild = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" } - -if (-not $msbuild -or -not (Test-Path $msbuild)) { - Write-Error "MSBuild not found. Install Visual Studio Build Tools or .NET Framework 4.7.2 Developer Pack." +if (-not (Test-Path $msbuild)) { + Write-Error "MSBuild not found." exit 1 } Write-Host "Using MSBuild: $msbuild" -ForegroundColor Gray -# --- Create temp csproj with resolved assembly paths --- +# --- Resolve all HintPaths to Disco bin --- $csproj = Join-Path $PluginDir "$PluginName.csproj" $csprojContent = Get-Content $csproj -Raw -# Replace all HintPaths to point at the single Disco bin directory -$csprojContent = $csprojContent -replace '[^<]*Disco\.Models\.dll', "$DiscoBinPath\Disco.Models.dll" -$csprojContent = $csprojContent -replace '[^<]*Disco\.Data\.dll', "$DiscoBinPath\Disco.Data.dll" -$csprojContent = $csprojContent -replace '[^<]*Disco\.Services\.dll', "$DiscoBinPath\Disco.Services.dll" - -# Newtonsoft.Json - use from Disco bin -$newtonsoftPath = Join-Path $DiscoBinPath "Newtonsoft.Json.dll" -if (Test-Path $newtonsoftPath) { - $csprojContent = $csprojContent -replace '[^<]*Newtonsoft\.Json\.dll', "$newtonsoftPath" -} - -# System.Web.Mvc - use from Disco bin if available -$mvcPath = Join-Path $DiscoBinPath "System.Web.Mvc.dll" -if (Test-Path $mvcPath) { - # Replace the strong-name reference with a HintPath reference - $csprojContent = $csprojContent -replace '', "$mvcPathFalse" -} +# Replace ALL HintPath entries to point at DiscoBinPath +# This catches Disco.Models, Disco.Data, Disco.Services, Newtonsoft.Json, +# System.Web.Mvc, System.Web.WebPages, System.Web.Razor, etc. +$csprojContent = [regex]::Replace($csprojContent, '[^<]+\\([^\\<]+\.dll)', "$DiscoBinPath\`$1") $tempCsproj = Join-Path $PluginDir "$PluginName.build.csproj" $csprojContent | Set-Content $tempCsproj -Encoding UTF8 -Write-Host "Assembly references resolved" -ForegroundColor Green +Write-Host "Assembly references resolved to $DiscoBinPath" -ForegroundColor Green # --- Build --- Write-Host "`nBuilding $PluginName ($Configuration)..." -ForegroundColor Yellow @@ -109,31 +85,24 @@ Write-Host "Build successful: $pluginDll" -ForegroundColor Green # --- Generate Manifest --- Write-Host "`nGenerating manifest..." -ForegroundColor Yellow -# Copy Disco assemblies to build output for ManifestGenerator resolution +# Copy all DLLs from Disco bin to build output for ManifestGenerator foreach ($dll in $requiredDlls) { - $src = Join-Path $DiscoBinPath $dll - Copy-Item $src $buildOutput -Force -ErrorAction SilentlyContinue + Copy-Item (Join-Path $DiscoBinPath $dll) $buildOutput -Force -ErrorAction SilentlyContinue } - -# Copy other dependencies from Disco bin -$depDlls = @("EntityFramework.dll", "System.Web.Mvc.dll", "RazorGenerator.Mvc.dll", "Newtonsoft.Json.dll") -foreach ($dep in $depDlls) { +$extraDlls = @("EntityFramework.dll", "System.Web.Mvc.dll", "System.Web.WebPages.dll", "System.Web.Razor.dll", "RazorGenerator.Mvc.dll", "Newtonsoft.Json.dll") +foreach ($dep in $extraDlls) { $depPath = Join-Path $DiscoBinPath $dep - if (Test-Path $depPath) { - Copy-Item $depPath $buildOutput -Force -ErrorAction SilentlyContinue - } + if (Test-Path $depPath) { Copy-Item $depPath $buildOutput -Force -ErrorAction SilentlyContinue } } -# Try Disco's ManifestGenerator if it exists in the bin path or nearby +# Try ManifestGenerator $useManifestGen = $false $manifestGenExe = Join-Path $DiscoBinPath "Disco.Services.Plugins.ManifestGenerator.exe" if (-not (Test-Path $manifestGenExe)) { - # Check parent directory $manifestGenExe = Join-Path (Split-Path $DiscoBinPath -Parent) "Disco.Services.Plugins.ManifestGenerator.exe" } if (Test-Path $manifestGenExe) { $useManifestGen = $true - Write-Host "Found ManifestGenerator: $manifestGenExe" -ForegroundColor Gray & $manifestGenExe $pluginDll if ($LASTEXITCODE -ne 0) { Write-Warning "ManifestGenerator failed, creating manifest manually..." @@ -142,7 +111,6 @@ if (Test-Path $manifestGenExe) { } if (-not $useManifestGen) { - # Create manifest.json manually $version = [System.Reflection.AssemblyName]::GetAssemblyName($pluginDll).Version $manifest = [ordered]@{ Id = $PluginName @@ -160,13 +128,13 @@ if (-not $useManifestGen) { Write-Host "Manual manifest.json created" -ForegroundColor Green } -# --- Package as .discoPlugin --- +# --- Package --- Write-Host "`nPackaging .discoPlugin file..." -ForegroundColor Yellow -# Disco-provided assemblies to exclude from the package $excludePatterns = @( "Disco.Models.*", "Disco.Data.*", "Disco.Services.*", "Disco.Web.*", "Disco.BI.*", - "EntityFramework.*", "System.Web.Mvc.*", "RazorGenerator.Mvc.*", "Newtonsoft.Json.*", + "EntityFramework.*", "System.Web.Mvc.*", "System.Web.WebPages.*", "System.Web.Razor.*", + "RazorGenerator.Mvc.*", "Newtonsoft.Json.*", "*.build.csproj", "*.discoPlugin" ) @@ -177,16 +145,13 @@ if (-not $version) { $packageName = "$PluginName-$($version.ToString()).discoPlugin" $packagePath = Join-Path $PluginDir $packageName -# Remove old packages Get-ChildItem $PluginDir -Filter "*.discoPlugin" | Remove-Item -Force -# Collect files for packaging (exclude Disco-provided assemblies) $filesToPackage = Get-ChildItem $buildOutput -Recurse -File | Where-Object { $file = $_.Name -not ($excludePatterns | Where-Object { $file -like $_ }) } -# Build package in temp directory $tempPkg = Join-Path $env:TEMP "discoplugin_$([guid]::NewGuid().ToString('N'))" New-Item -ItemType Directory -Path $tempPkg -Force | Out-Null foreach ($f in $filesToPackage) {