172 lines
6.9 KiB
PowerShell
172 lines
6.9 KiB
PowerShell
# Build-Plugin.ps1
|
|
# Builds and packages the AD Compare plugin for Disco ICT import
|
|
#
|
|
# Usage:
|
|
# .\Build-Plugin.ps1 -DiscoBinPath "C:\Program Files\Disco\WebApp\bin"
|
|
|
|
param(
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$DiscoBinPath,
|
|
|
|
[string]$Configuration = "Release"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
$PluginDir = $PSScriptRoot
|
|
$PluginName = "Disco.Plugins.ADCompare"
|
|
|
|
Write-Host "=== AD Compare Plugin Builder ===" -ForegroundColor Cyan
|
|
Write-Host "Disco bin path: $DiscoBinPath" -ForegroundColor Gray
|
|
|
|
# --- Validate ---
|
|
if (-not (Test-Path $DiscoBinPath)) {
|
|
Write-Error "Disco bin path not found: $DiscoBinPath"
|
|
exit 1
|
|
}
|
|
|
|
$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"
|
|
exit 1
|
|
}
|
|
}
|
|
Write-Host "All required Disco assemblies found" -ForegroundColor Green
|
|
|
|
# --- Find MSBuild ---
|
|
$msbuild = $null
|
|
$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
|
|
}
|
|
if (-not $msbuild -or -not (Test-Path $msbuild)) {
|
|
$msbuild = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe"
|
|
}
|
|
if (-not (Test-Path $msbuild)) {
|
|
Write-Error "MSBuild not found."
|
|
exit 1
|
|
}
|
|
Write-Host "Using MSBuild: $msbuild" -ForegroundColor Gray
|
|
|
|
# --- Resolve all HintPaths to Disco bin ---
|
|
$csproj = Join-Path $PluginDir "$PluginName.csproj"
|
|
$csprojContent = Get-Content $csproj -Raw
|
|
$csprojContent = [regex]::Replace($csprojContent, '<HintPath>[^<]+\\([^\\<]+\.dll)</HintPath>', "<HintPath>$DiscoBinPath\`$1</HintPath>")
|
|
|
|
$tempCsproj = Join-Path $PluginDir "$PluginName.build.csproj"
|
|
$csprojContent | Set-Content $tempCsproj -Encoding UTF8
|
|
Write-Host "Assembly references resolved to $DiscoBinPath" -ForegroundColor Green
|
|
|
|
# --- Build ---
|
|
Write-Host "`nBuilding $PluginName ($Configuration)..." -ForegroundColor Yellow
|
|
$buildOutput = Join-Path $PluginDir "bin\$Configuration"
|
|
|
|
& $msbuild $tempCsproj /p:Configuration=$Configuration /p:OutputPath=$buildOutput /t:Build /v:minimal
|
|
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Remove-Item $tempCsproj -ErrorAction SilentlyContinue
|
|
Write-Error "Build failed!"
|
|
exit 1
|
|
}
|
|
Remove-Item $tempCsproj -ErrorAction SilentlyContinue
|
|
|
|
$pluginDll = Join-Path $buildOutput "$PluginName.dll"
|
|
if (-not (Test-Path $pluginDll)) {
|
|
Write-Error "Build output not found: $pluginDll"
|
|
exit 1
|
|
}
|
|
Write-Host "Build successful: $pluginDll" -ForegroundColor Green
|
|
|
|
# --- Generate Manifest ---
|
|
Write-Host "`nGenerating manifest..." -ForegroundColor Yellow
|
|
|
|
# Copy all needed DLLs to build output for ManifestGenerator type resolution
|
|
foreach ($dll in $requiredDlls) {
|
|
Copy-Item (Join-Path $DiscoBinPath $dll) $buildOutput -Force -ErrorAction SilentlyContinue
|
|
}
|
|
$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 }
|
|
}
|
|
|
|
# Try the real ManifestGenerator first - it uses reflection to find [PluginFeature] attributes
|
|
# and generates the correct manifest format including UIExtension features
|
|
$useManifestGen = $false
|
|
$manifestGenExe = Join-Path $DiscoBinPath "Disco.Services.Plugins.ManifestGenerator.exe"
|
|
if (-not (Test-Path $manifestGenExe)) {
|
|
$manifestGenExe = Join-Path (Split-Path $DiscoBinPath -Parent) "Disco.Services.Plugins.ManifestGenerator.exe"
|
|
}
|
|
if (Test-Path $manifestGenExe) {
|
|
Write-Host "Found ManifestGenerator, using it for proper feature discovery..." -ForegroundColor Gray
|
|
$useManifestGen = $true
|
|
& $manifestGenExe $pluginDll
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-Warning "ManifestGenerator failed, creating manifest manually..."
|
|
$useManifestGen = $false
|
|
} else {
|
|
Write-Host "ManifestGenerator completed successfully" -ForegroundColor Green
|
|
}
|
|
}
|
|
|
|
if (-not $useManifestGen) {
|
|
$version = [System.Reflection.AssemblyName]::GetAssemblyName($pluginDll).Version
|
|
# Manual manifest - do NOT include Features array as the format must match
|
|
# exactly what ManifestGenerator produces. Without it, features won't auto-register
|
|
# but the web handler comparison dashboard still works fully.
|
|
$manifest = [ordered]@{
|
|
Id = $PluginName
|
|
Name = "AD Compare"
|
|
Author = "Jess Rogerson"
|
|
Url = "https://gitea.hideawaygaming.com.au/jessikitty/disco-ad-compare-plugin"
|
|
Version = $version.ToString()
|
|
AssemblyPath = "$PluginName.dll"
|
|
TypeName = "Disco.Plugins.ADCompare.ADComparePlugin"
|
|
ConfigurationHandlerTypeName = "Disco.Plugins.ADCompare.ConfigurationHandler.ADCompareConfigurationHandler"
|
|
WebHandlerTypeName = "Disco.Plugins.ADCompare.WebHandler.ADCompareWebHandler"
|
|
}
|
|
$manifest | ConvertTo-Json -Depth 5 | Set-Content (Join-Path $buildOutput "manifest.json") -Encoding UTF8
|
|
Write-Host "Manual manifest.json created (without UIExtension features)" -ForegroundColor Yellow
|
|
Write-Host " Note: For full UIExtension support on device/user pages," -ForegroundColor Yellow
|
|
Write-Host " install Disco.Services.Plugins.ManifestGenerator.exe" -ForegroundColor Yellow
|
|
}
|
|
|
|
# --- Package ---
|
|
Write-Host "`nPackaging .discoPlugin file..." -ForegroundColor Yellow
|
|
|
|
$includeFiles = @("$PluginName.dll", "$PluginName.pdb", "manifest.json")
|
|
|
|
if (-not $version) {
|
|
$version = [System.Reflection.AssemblyName]::GetAssemblyName($pluginDll).Version
|
|
}
|
|
|
|
$packageName = "$PluginName-$($version.ToString()).discoPlugin"
|
|
$packagePath = Join-Path $PluginDir $packageName
|
|
|
|
Get-ChildItem $PluginDir -Filter "*.discoPlugin" | Remove-Item -Force
|
|
Get-ChildItem $PluginDir -Filter "*.zip" | Where-Object { $_.Name -like "$PluginName*" } | Remove-Item -Force
|
|
|
|
$tempPkg = Join-Path $env:TEMP "discoplugin_$([guid]::NewGuid().ToString('N'))"
|
|
New-Item -ItemType Directory -Path $tempPkg -Force | Out-Null
|
|
foreach ($f in $includeFiles) {
|
|
$src = Join-Path $buildOutput $f
|
|
if (Test-Path $src) {
|
|
Copy-Item $src $tempPkg -Force
|
|
}
|
|
}
|
|
|
|
Write-Host "Files in package:" -ForegroundColor Gray
|
|
Get-ChildItem $tempPkg -File | ForEach-Object {
|
|
Write-Host " $($_.Name)" -ForegroundColor Gray
|
|
}
|
|
|
|
$zipPath = Join-Path $PluginDir "$PluginName-$($version.ToString()).zip"
|
|
Compress-Archive -Path "$tempPkg\*" -DestinationPath $zipPath -Force
|
|
Rename-Item $zipPath $packageName -Force
|
|
Remove-Item $tempPkg -Recurse -Force
|
|
|
|
$packageSize = [math]::Round((Get-Item $packagePath).Length / 1KB, 1)
|
|
Write-Host "`n=== Package created: $packagePath ($($packageSize) KB) ===" -ForegroundColor Green
|
|
Write-Host "Import into Disco ICT via: Configuration > Plugins > Install Plugin" -ForegroundColor Cyan
|