学无先后达者为师!
不忘初心,砥砺前行。

使用 Nuke 生成 NewLife.XCode 所需的实体类文件

本文介绍了一种在命令行环境下使用 Nuke 根据 XCode 模型文件生成 Entity 实体类的技术。本文假设你已经掌握了 NewLife.XCode 基本的使用方法,并且已经有了一个编写好的 XCode 模型 XML 文件。

什么是 Nuke ?

根据官方仓库的说明:Nuke 是适用于 C#/.NET 的构建系统。简单来说,我们可以使用 Nuke 实现直接使用 C# 构建 CI/CD 管道。

Nuke 快速入门

1、安装全局工具

dotnet tool install Nuke.GlobalTool --global

2、转到代码存储仓库,初始化 nuke

nuke :setup

创建过程中可能会让你选择一些信息,作为 Demo 项目,一路回车即可。

3、运行构建

nuke

Build.cs 文件

如果一切顺利,我们会在 build 目录下发现一个名为 Build.cs 的文件,核心代码如下:

class Build : NukeBuild
{
    public static int Main () => Execute<Build>(x => x.Compile);

    Target Clean => _ => ...... ;

    Target Restore => _ => ...... ;

    Target Compile => _ => ...... ;
}

其中返回值为 Target 的 Clean、Restore 和 Compile 三个方法分别代表三个构建目标。我们可以在对应的方法中编写 C# 代码来实现构建。

可以看到,程序入口默认使用了 Compile 。这表示如果我们直接执行 nuke 命令,将会默认调用 Compile 方法。

如果需要调用 Clean 方法,可以使用:

nuke Clean

或者在根目录调用 build 脚本(如果机器上没有安装 nuke 的话):

build Clean

与 XCode 集成

因为 _build 项目本身就是一个 C# 项目,因此可以直接引用 NewLife.XCode 的类库:

dotnet add package NewLife.XCode

要实现从模型文件生成实体可以使用以下代码:

static void BuildEntity(String modelFile, ILog log)
{
    XTrace.WriteLine("正在处理:{0}", modelFile);

    PathHelper.BasePath = Path.GetDirectoryName(modelFile);
    var options = new EntityBuilderOption();
    var tables = ClassBuilder.LoadModels(modelFile, options, out var attrs);
    EntityBuilder.FixModelFile(modelFile, options, attrs, tables);
    if (string.IsNullOrWhiteSpace(options.Output))
    {
        options.Output = Path.GetDirectoryName(modelFile);
    }
    else
    {
        options.Output = Path.Combine(Path.GetDirectoryName(modelFile), options.Output);
    }
    EntityBuilder.BuildTables(tables, options, log);
}

不言自明:

  • modelFile 参数代表 XML 模型文件的全路径。
  • log 参数代表日志对象,直接传入 XTrace.Log 即可。

实现 Entity 构建目标

NukeBuild 类型有一个静态 RootDirectory 属性代表项目的根目录(就是 build 脚本所在的目录)。我们可以新建一个 Entity 构建目标,在构建过程中扫描所有子目录下的模型文件,并依次调用 BuildEntity 方法即可。

Target Entity => _ => _
    .Executes(() =>
    {
        RootDirectory.GlobFiles("**/*.xml")
        .ForEach(path =>
        {
            var txt = File.ReadAllText(path);
            if (!txt.Contains("<Tables") && !txt.Contains("<EntityModel")) return;
            BuildEntity(path, XTrace.Log);
        });
    });

执行 Entity 构建:

nuke Entity

build Entity

构建结果如下:

PowerShell Desktop version 5.1.19041.4648
Microsoft (R) .NET SDK version 8.0.303
​
███╗   ██╗██╗   ██╗██╗  ██╗███████╗
████╗  ██║██║   ██║██║ ██╔╝██╔════╝
██╔██╗ ██║██║   ██║█████╔╝ █████╗  
██║╚██╗██║██║   ██║██╔═██╗ ██╔══╝  
██║ ╚████║╚██████╔╝██║  ██╗███████╗
╚═╝  ╚═══╝ ╚═════╝ ╚═╝  ╚═╝╚══════╝
​
NUKE Execution Engine version 8.0.0 (Windows,.NETCoreApp,Version=v8.0)
​
​
╬═══════════
║ Entity
╬══
​
19:19:37.203  1 N - NewLife.Core v10.10.2024.0701 Build 2024-07-01 .NET 8.0
19:19:37.204  1 N - NewLife组件核心库 ©2002-2024 NewLife
19:19:37.205  1 N - _build v1.0.0 Build 2000-01-01 .NET 8.0
19:19:37.205  1 N - _build
19:19:37.206  1 N - 正在处理:D:\src\coderbusy.com\nuke_xcode\src\HiXCode\Model.xml
19:19:37.213  1 N - XCode v11.13.2024.0701 Build 2024-07-01 .NET Standard 2.1
19:19:37.214  1 N - NewLife数据中间件 ©2002-2024 NewLife
19:19:37.215  1 N - 当前配置为输出SQL日志,如果觉得日志过多,可以修改配置关闭[Config/XCode.config:ShowSQL=false]。
19:19:37.237  1 N - 生成实体类 D:\src\coderbusy.com\nuke_xcode\src\HiXCode\Entity
19:19:37.241  1 N - 生成 Group 知识组 {"BaseClass":"Entity","Namespace":"HiXCode.Entity"}
19:19:37.248  1 N - 生成 Group 知识组 {"BaseClass":"Entity","Namespace":"HiXCode.Entity"}
​
═══════════════════════════════════════
Target             Status      Duration
───────────────────────────────────────
Entity             Succeeded     < 1sec
───────────────────────────────────────
Total                            < 1sec
═══════════════════════════════════════
​
Build succeeded on 2024/7/22 19:19:37. \(^ᴗ^)/

结语

对于笔者来说,XCode 不是一个新东西,但 Nuke 就比较陌生了。虽然 XCode 目前已经有多种方式可以用来生成实体类,但在接触了 Nuke 以后我立马想到可以将这两者进行集成。借助 Nuke 搭建好的脚手架,我们将获得以下好处:

  1. 支持跨平台
  2. 无需安装额外的工具(除了初始化 Nuke 时,其他情况下是不要求系统中安装有 Nuke 的)。
  3. 没有版本问题,生成器的版本可以和项目使用的主版本一致。

为了便于大家理解,我做了一个小 Demo 放在 Gitee 上,开源地址是:

https://gitee.com/coderbusy/nuke_xcode

赞(2) 打赏
未经允许不得转载:码农很忙 » 使用 Nuke 生成 NewLife.XCode 所需的实体类文件

评论 抢沙发

给作者买杯咖啡

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册