znlgis 博客

GIS开发与技术分享

第十七章:项目部署与发布指南

17.1 部署概述

17.1.1 FY_Layout部署架构

FY_Layout作为飞扬集成设计平台的插件,其部署遵循飞扬平台的插件部署规范。部署架构如下:

飞扬主程序安装目录/
├── FeiYang.exe              # 飞扬主程序
├── FeiYang.dll.config       # 主程序配置
├── Plugins/                 # 插件目录
│   ├── QdLayout/            # 场布插件
│   │   ├── QdLayout.dll     # 场布主程序集
│   │   ├── QdLayout.pdb     # 调试符号文件
│   │   └── Resources/       # 资源文件
│   └── QdLayoutProvider/    # 场布Provider
│       ├── QdLayoutProvider.dll  # Provider程序集
│       └── QdLayoutProvider.pdb  # 调试符号文件
├── Libs/                    # 共享库目录
│   ├── LightCAD.Core.dll
│   ├── LightCAD.Drawing.dll
│   ├── LightCAD.MathLib.dll
│   ├── LightCAD.Runtime.dll
│   ├── LightCAD.Model.dll
│   ├── LightCAD.RenderUtils.dll
│   ├── ThreeJs4Net.dll
│   ├── netDxf.dll
│   ├── Newtonsoft.Json.dll
│   ├── OpenTK.dll
│   ├── Dapper.dll
│   ├── Svg.dll
│   └── ... (其他依赖库)
└── Config/                  # 配置文件目录
    └── plugins.json         # 插件注册配置

17.1.2 部署模式

FY_Layout支持两种部署模式:

模式 说明 适用场景
开发模式 直接使用Build目录输出 开发和调试阶段
发布模式 打包为独立插件包 生产环境部署

17.2 编译配置

17.2.1 解决方案配置

LightBIM.sln支持以下编译配置:

<!-- LightBIM.sln 配置 -->
GlobalSection(SolutionConfigurationPlatforms) = preSolution
    Debug|Any CPU = Debug|Any CPU
    Release|Any CPU = Release|Any CPU
EndGlobalSection

17.2.2 项目编译设置

QdLayout.csproj的编译配置:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <BaseOutputPath>..\Build</BaseOutputPath>
  </PropertyGroup>

  <!-- Debug配置 -->
  <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
  </PropertyGroup>

  <!-- Release配置 -->
  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <DefineConstants>TRACE</DefineConstants>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
  </PropertyGroup>

  <ItemGroup>
    <!-- LightCAD核心库引用 -->
    <Reference Include="LightCAD.Core">
      <HintPath>..\Libs\LightCAD.Core.dll</HintPath>
    </Reference>
    <Reference Include="LightCAD.Drawing">
      <HintPath>..\Libs\LightCAD.Drawing.dll</HintPath>
    </Reference>
    <Reference Include="LightCAD.Drawing.Actions">
      <HintPath>..\Libs\LightCAD.Drawing.Actions.dll</HintPath>
    </Reference>
    <Reference Include="LightCAD.MathLib">
      <HintPath>..\Libs\LightCAD.MathLib.dll</HintPath>
    </Reference>
    <Reference Include="LightCAD.Model">
      <HintPath>..\Libs\LightCAD.Model.dll</HintPath>
    </Reference>
    <Reference Include="LightCAD.Runtime">
      <HintPath>..\Libs\LightCAD.Runtime.dll</HintPath>
    </Reference>
    <Reference Include="LightCAD.RenderUtils">
      <HintPath>..\Libs\LightCAD.RenderUtils.dll</HintPath>
    </Reference>
    <!-- 第三方库引用 -->
    <Reference Include="ThreeJs4Net">
      <HintPath>..\Libs\ThreeJs4Net.dll</HintPath>
    </Reference>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\Libs\Newtonsoft.Json.dll</HintPath>
    </Reference>
    <Reference Include="netDxf">
      <HintPath>..\Libs\netDxf.dll</HintPath>
    </Reference>
    <Reference Include="Svg">
      <HintPath>..\Libs\Svg.dll</HintPath>
    </Reference>
    <Reference Include="OpenTK">
      <HintPath>..\Libs\OpenTK.dll</HintPath>
    </Reference>
    <Reference Include="OpenTK.WinForms">
      <HintPath>..\Libs\OpenTK.WinForms.dll</HintPath>
    </Reference>
    <Reference Include="Flee">
      <HintPath>..\Libs\Flee.dll</HintPath>
    </Reference>
    <Reference Include="WinFormsUI">
      <HintPath>..\Libs\WinFormsUI.dll</HintPath>
    </Reference>
    <Reference Include="Dapper">
      <HintPath>..\Libs\Dapper.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

17.2.3 编译命令

# 使用dotnet CLI编译
dotnet build LightBIM.sln -c Debug
dotnet build LightBIM.sln -c Release

# 使用MSBuild编译
msbuild LightBIM.sln /p:Configuration=Release /p:Platform="Any CPU"

# 清理编译输出
dotnet clean LightBIM.sln

17.3 发布流程

17.3.1 Release编译

# 1. 清理旧的编译输出
dotnet clean LightBIM.sln -c Release

# 2. 还原NuGet包
dotnet restore LightBIM.sln

# 3. Release模式编译
dotnet build LightBIM.sln -c Release

# 4. 检查输出
ls -la Build/net8.0-windows/

17.3.2 打包脚本

# publish.ps1 - 发布打包脚本
param(
    [string]$Version = "1.0.0",
    [string]$OutputDir = ".\Publish"
)

Write-Host "开始打包 FY_Layout v$Version ..."

# 编译Release版本
dotnet build LightBIM.sln -c Release
if ($LASTEXITCODE -ne 0) {
    Write-Error "编译失败"
    exit 1
}

# 创建输出目录
$pluginDir = "$OutputDir\FY_Layout_v$Version"
New-Item -ItemType Directory -Force -Path $pluginDir

# 复制插件DLL
Copy-Item "Build\net8.0-windows\QdLayout.dll" $pluginDir
Copy-Item "Build\net8.0-windows\QdLayoutProvider.dll" $pluginDir

# 复制资源文件
if (Test-Path "Build\net8.0-windows\Resources") {
    Copy-Item -Recurse "Build\net8.0-windows\Resources" $pluginDir
}

# 创建版本信息文件
@{
    Name = "FY_Layout"
    Version = $Version
    Description = "飞扬集成设计平台场地布置插件"
    Author = "znlgis"
    License = "CC-BY-NC 4.0"
    MinPlatformVersion = "1.0.0"
    Dependencies = @(
        "LightCAD.Core",
        "LightCAD.Drawing",
        "LightCAD.MathLib",
        "ThreeJs4Net"
    )
} | ConvertTo-Json | Out-File "$pluginDir\plugin.json"

# 创建ZIP包
Compress-Archive -Path $pluginDir -DestinationPath "$OutputDir\FY_Layout_v$Version.zip" -Force

Write-Host "打包完成: $OutputDir\FY_Layout_v$Version.zip"

17.3.3 版本管理

// 在LayoutPlugin.cs中添加版本信息
public class LayoutPlugin : ILcPlugin
{
    public static readonly string PluginName = "FY_Layout";
    public static readonly string PluginVersion = "1.0.0";
    public static readonly string PluginAuthor = "znlgis";

    public void Loaded()
    {
        LayoutLogger.Info($"{PluginName} v{PluginVersion} 正在加载...");

        // 注册元素类型
        LcDocument.RegistElementTypes(LayoutElementType.All);

        // ... 其他初始化 ...

        LayoutLogger.Info($"{PluginName} v{PluginVersion} 加载完成");
    }
}

17.4 安装部署

17.4.1 手动安装

安装步骤:
1. 下载 FY_Layout_vX.X.X.zip
2. 解压到飞扬主程序的 Plugins 目录
3. 重启飞扬主程序
4. 在工具栏中应出现"场布"选项卡

17.4.2 插件配置

// plugins.json - 插件注册配置
{
    "plugins": [
        {
            "name": "FY_Layout",
            "version": "1.0.0",
            "assembly": "Plugins/QdLayout/QdLayout.dll",
            "provider": "Plugins/QdLayoutProvider/QdLayoutProvider.dll",
            "enabled": true,
            "autoLoad": true
        }
    ]
}

17.4.3 环境检查清单

部署前检查清单:
□ .NET 8.0 Runtime 已安装
□ Visual C++ Redistributable 已安装
□ OpenGL驱动已更新
□ 飞扬主程序版本兼容
□ 所有依赖库已包含在Libs目录
□ 插件DLL已放置在正确位置
□ 配置文件已正确设置

17.5 更新与升级

17.5.1 热更新策略

// 插件支持热更新检查
public void CheckForUpdates()
{
    try
    {
        // 检查版本更新
        var currentVersion = new Version(PluginVersion);
        var latestVersion = GetLatestVersion();

        if (latestVersion > currentVersion)
        {
            // 提示用户更新
            var result = MessageBox.Show(
                $"发现新版本 {latestVersion},是否更新?",
                "FY_Layout 更新",
                MessageBoxButtons.YesNo);

            if (result == DialogResult.Yes)
            {
                // 下载并安装更新
                DownloadAndInstallUpdate(latestVersion);
            }
        }
    }
    catch (Exception ex)
    {
        LayoutLogger.Error("检查更新失败", ex);
    }
}

17.5.2 数据迁移

// 版本升级时的数据迁移
public class DataMigration
{
    public static void Migrate(string fromVersion, string toVersion)
    {
        var from = new Version(fromVersion);
        var to = new Version(toVersion);

        if (from < new Version("1.1.0") && to >= new Version("1.1.0"))
        {
            // v1.0 → v1.1 迁移
            MigrateV10ToV11();
        }

        if (from < new Version("2.0.0") && to >= new Version("2.0.0"))
        {
            // v1.x → v2.0 迁移
            MigrateV1xToV20();
        }
    }

    private static void MigrateV10ToV11()
    {
        // 迁移逻辑:
        // 1. 更新元素类型GUID映射
        // 2. 转换属性格式
        // 3. 更新图层命名规范
    }
}

17.6 故障排除

17.6.1 常见部署问题

问题 原因 解决方案
插件不加载 DLL路径错误 检查plugins.json配置
缺少依赖库 Libs目录不完整 补充缺失的DLL
版本不兼容 .NET版本不匹配 安装对应.NET Runtime
三维不显示 OpenGL驱动过旧 更新显卡驱动
UI乱码 字体缺失 安装”仿宋”等中文字体

17.6.2 诊断工具

// 插件诊断信息收集
public static class DiagnosticTool
{
    public static string CollectDiagnostics()
    {
        var sb = new StringBuilder();
        sb.AppendLine("=== FY_Layout 诊断信息 ===");
        sb.AppendLine($"插件版本: {LayoutPlugin.PluginVersion}");
        sb.AppendLine($"运行时: {Environment.Version}");
        sb.AppendLine($"操作系统: {Environment.OSVersion}");
        sb.AppendLine($"64位系统: {Environment.Is64BitOperatingSystem}");
        sb.AppendLine($"64位进程: {Environment.Is64BitProcess}");
        sb.AppendLine($"工作目录: {Environment.CurrentDirectory}");

        // 检查依赖库
        sb.AppendLine("\n=== 依赖库检查 ===");
        var libs = new[]
        {
            "LightCAD.Core", "LightCAD.Drawing",
            "LightCAD.MathLib", "ThreeJs4Net",
            "Newtonsoft.Json", "netDxf"
        };
        foreach (var lib in libs)
        {
            try
            {
                var asm = AppDomain.CurrentDomain.GetAssemblies()
                    .FirstOrDefault(a => a.GetName().Name == lib);
                sb.AppendLine($"  {lib}: {(asm != null ? asm.GetName().Version.ToString() : "未加载")}");
            }
            catch
            {
                sb.AppendLine($"  {lib}: 检查失败");
            }
        }

        // 检查OpenGL
        sb.AppendLine("\n=== OpenGL信息 ===");
        try
        {
            sb.AppendLine($"  渲染器: {OpenTK.Graphics.OpenGL.GL.GetString(OpenTK.Graphics.OpenGL.StringName.Renderer)}");
            sb.AppendLine($"  版本: {OpenTK.Graphics.OpenGL.GL.GetString(OpenTK.Graphics.OpenGL.StringName.Version)}");
        }
        catch
        {
            sb.AppendLine("  OpenGL信息获取失败");
        }

        return sb.ToString();
    }
}

17.7 本章小结

本章详细介绍了FY_Layout项目的部署与发布流程:

  1. 部署架构:插件式部署,包含主程序集和Provider程序集
  2. 编译配置:支持Debug和Release两种模式,使用dotnet CLI或MSBuild
  3. 发布打包:标准化的打包脚本和版本管理
  4. 安装部署:手动安装步骤和插件配置
  5. 更新升级:热更新检查和数据迁移策略
  6. 故障排除:常见问题诊断和解决方案

规范化的部署流程是确保FY_Layout插件稳定运行的重要保障。


上一章:调试测试与性能优化 下一章:API参考手册