首次提交: OnebotCatalog 项目代码与文档(含 NX 按需生成服务二期、后台、一键启动)
This commit is contained in:
90
tools/build.ps1
Normal file
90
tools/build.ps1
Normal file
@@ -0,0 +1,90 @@
|
||||
# OnebotCatalog 编译脚本 (零安装: 使用 VS Build Tools 自带 Roslyn csc + Windows 自带 .NET Framework 4.8/WPF)
|
||||
# 用法:
|
||||
# 开发版: powershell -NoProfile -ExecutionPolicy Bypass -File tools\build.ps1
|
||||
# 客户版: powershell -NoProfile -ExecutionPolicy Bypass -File tools\build.ps1 -Customer [-Opc 数据包.opc]
|
||||
param(
|
||||
[string]$Out = (Join-Path $PSScriptRoot '..\bin\OnebotCatalog.exe'),
|
||||
[switch]$Customer,
|
||||
[string]$Opc = (Join-Path $PSScriptRoot '..\sample\OnebotCatalog_2026.08.opc'),
|
||||
[string]$Icon = (Join-Path $PSScriptRoot '..\assets\OneBot-logo.ico')
|
||||
)
|
||||
if ($Customer -and -not $PSBoundParameters.ContainsKey('Out')) {
|
||||
$Out = Join-Path $PSScriptRoot '..\bin\OnebotCatalog-Customer.exe'
|
||||
}
|
||||
|
||||
$root = $PSScriptRoot
|
||||
$fw = 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319'
|
||||
$wpf = Join-Path $fw 'WPF'
|
||||
$csc = 'C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\Roslyn\csc.exe'
|
||||
|
||||
if (-not (Test-Path $csc)) { Write-Output '未找到 csc.exe (VS Build Tools)'; exit 1 }
|
||||
|
||||
$refs = @(
|
||||
(Join-Path $fw 'mscorlib.dll'),
|
||||
(Join-Path $fw 'System.dll'),
|
||||
(Join-Path $fw 'System.Core.dll'),
|
||||
(Join-Path $fw 'System.Data.dll'),
|
||||
(Join-Path $fw 'System.Xaml.dll'),
|
||||
(Join-Path $fw 'System.IO.Compression.dll'),
|
||||
(Join-Path $fw 'System.IO.Compression.FileSystem.dll'),
|
||||
(Join-Path $fw 'System.Web.Extensions.dll'),
|
||||
(Join-Path $fw 'System.Windows.Forms.dll'),
|
||||
(Join-Path $wpf 'WindowsBase.dll'),
|
||||
(Join-Path $wpf 'PresentationCore.dll'),
|
||||
(Join-Path $wpf 'PresentationFramework.dll')
|
||||
)
|
||||
|
||||
# 开源 3D 渲染库 Helix Toolkit (MIT): 窗口内直渲 STL/OBJ 网格 (真实数模预览, 免浏览器)
|
||||
$helixDir = Join-Path $PSScriptRoot '..\lib'
|
||||
$helixWpf = Join-Path $helixDir 'HelixToolkit.Wpf.dll'
|
||||
$helixCore = Join-Path $helixDir 'HelixToolkit.dll'
|
||||
if ((Test-Path $helixWpf) -and (Test-Path $helixCore)) {
|
||||
$refs += @($helixWpf, $helixCore)
|
||||
} else {
|
||||
Write-Output '警告: lib\ 缺 HelixToolkit DLL, 跳过 3D 窗口内渲染引用 (仅影响真实数模窗口内预览)'
|
||||
}
|
||||
|
||||
# WebView2 控件 (微软, 窗口内嵌新迪查看器显示真实 STEP, 免弹浏览器; Win11 自带运行时)
|
||||
$wv2Core = Join-Path $helixDir 'Microsoft.Web.WebView2.Core.dll'
|
||||
$wv2Wpf = Join-Path $helixDir 'Microsoft.Web.WebView2.Wpf.dll'
|
||||
$wv2Loader = Join-Path $helixDir 'WebView2Loader.dll'
|
||||
if ((Test-Path $wv2Core) -and (Test-Path $wv2Wpf)) {
|
||||
$refs += @($wv2Core, $wv2Wpf)
|
||||
} else {
|
||||
Write-Output '警告: lib\ 缺 WebView2 DLL, 跳过窗口内嵌 3D (真实数模将回退浏览器预览)'
|
||||
}
|
||||
|
||||
# GenServer (NX 按需生成服务, 独立控制台 exe) 单独编译, 不进主程序
|
||||
$srcs = Get-ChildItem (Join-Path $root '..\src') -Filter '*.cs' -Recurse |
|
||||
Where-Object { $_.FullName -notmatch '\\GenServer\\' } | ForEach-Object { $_.FullName }
|
||||
if (-not $srcs) { Write-Output 'src 下无 .cs 文件'; exit 1 }
|
||||
|
||||
$outDir = Split-Path $Out
|
||||
New-Item -ItemType Directory -Force -Path $outDir | Out-Null
|
||||
|
||||
$cscArgs = @('/nologo', '/target:winexe', '/platform:anycpu', '/optimize+', '/utf8output', ('/out:' + $Out))
|
||||
# OneBot logo 嵌入资源 (窗口图标 + 顶栏 logo)
|
||||
$logoPng = Join-Path $PSScriptRoot '..\assets\OneBot-logo.png'
|
||||
if (Test-Path $logoPng) { $cscArgs += ('/resource:' + $logoPng + ',OneBot-logo.png') }
|
||||
if ($Customer) {
|
||||
$cscArgs += '/define:CUSTOMER_BUILD'
|
||||
if (Test-Path $Opc) { $cscArgs += ('/resource:' + $Opc + ',catalog.opc') }
|
||||
else { Write-Output ("警告: 找不到数据包 " + $Opc + ", 客户版将无内置数据") }
|
||||
if (Test-Path $Icon) { $cscArgs += ('/win32icon:' + $Icon) }
|
||||
}
|
||||
foreach ($r in $refs) { if (Test-Path $r) { $cscArgs += ('/reference:' + $r) } }
|
||||
$cscArgs += $srcs
|
||||
|
||||
& $csc @cscArgs
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
# 第三方 DLL 与 exe 同目录, 运行时加载 (Helix + WebView2; WebView2Loader 为 native, 必须同目录)
|
||||
if (Test-Path $helixWpf) { Copy-Item $helixWpf $outDir -Force }
|
||||
if (Test-Path $helixCore) { Copy-Item $helixCore $outDir -Force }
|
||||
if (Test-Path $wv2Core) { Copy-Item $wv2Core $outDir -Force }
|
||||
if (Test-Path $wv2Wpf) { Copy-Item $wv2Wpf $outDir -Force }
|
||||
if (Test-Path $wv2Loader) { Copy-Item $wv2Loader $outDir -Force }
|
||||
Write-Output ("编译成功: " + $Out)
|
||||
} else {
|
||||
Write-Output ("编译失败 (exit " + $LASTEXITCODE + ")")
|
||||
exit 1
|
||||
}
|
||||
Reference in New Issue
Block a user