Nx 介绍: 基于插件的单一代码库(Monorepo)构建系统


前言

Nx is a smart, fast and extensible build system with first class monorepo support and powerful integrations.

Nx 是一个智能的、快速的、可扩展的,单代码库优先和强大的插件集成的构建系统。


一、Nx 设计理念

Nx的设计理念与Visual Studio Code类似。VSCode是一个强大的文本编辑器,即使你不安装任何扩展,你也可以使用它非常高效。VSCode的扩展生态系统可以真正提高你的工作效率。

Nx的核心是通用的、简单的和透明的。Nx插件尽管对许多项目非常有用,但完全是可选的。Nx是一个VSCode的构建工具,具有强大的核心,由元数据驱动,并通过插件进行扩展。

二、Nx 核心概念

1. 项目图 - Project graph

项目图用于反映库中的源代码和所有不在库中创建的外部依赖项(如Webpack、React、Angular等)。Nx会存储缓存的项目图,所以它只会重新分析你修改过的文件。
在这里插入图片描述

2.元数据驱动 - Metadata driven

Nx中的所有东西都带有元数据,以支持工具性。默认值、验证、自动完成工作等等都在模式中定义,而不是在代码中定义。

3. 任务图 - Task graph

Nx基于项目图来创建任务图。每当你运行任何东西时,Nx都会从项目图中创建一个任务图,然后执行该图中的任务。但任务图与项目图不要求相同结构如,运行 nx run-many --target=test --projects=app1,app2,lib
生成的任务图:尽管app1依赖于 lib,但 app1:test不依赖于lib:test。这意味着两个任务可以并行运行,提高整体执行时间:在这里插入图片描述

4.受影响指令 Affected commands

随着工作空间的增长,重新测试所有项目会变得太慢。 为了解决这个问题,Nx实现了代码变更分析,以获得需要重新测试的最小项目集。
nx affected --target=test
在这里插入图片描述

5. 计算缓存 - Computation hashing and caching

Nx支持计算缓存,不会重复执行相同的计算。 这个计算缓存是可插拔的,并且可以分布式运行。
Nx按照正确的顺序运行任务图中的任务。在运行任务之前,Nx会计算它的计算散列。只要计算哈希值相同,运行任务的输出也相同。如果 Nx 没有找到这个计算,Nx 运行这个任务,完成后,它获取输出和终端输出,并将其存储在本地(如果是远程配置的话),所有这些对用户都是透明的。
在这里插入图片描述

三、常用指令

1. 创建工作区

npx create-nx-workspace@latest
指定创建参数 -preset 预设:
npx create-nx-workspace --preset=core

2.代码生成

nx generate <collection:generator>

参数:dryRun ,只展示结果给,不实际生成本地文件

3. 执行任务

nx run <target> [options]

4. 项目图

nx graph

5. 已安装插件

nx list [plugin]

目录结构

myorg/
├── apps/
├── libs/
├── tools/
├── workspace.json
├── nx.json
├── package.json
└── tsconfig.base.json
  • apps/ 应用源码,建议尽量保持应用源码简洁,通用逻辑放到库源码中
  • libs/ 库源码
  • tools/ 常用工具,如 数据库脚本、工作区代码生成器脚本等
  • workspace.json 列出当前工作区的所有项目(可选)
  • nx.json Nx Cli的配置文件,如缓存及任务执行设置
  • tsconfig.base.json TypeScript全局设置

参考

  • Nx官网文档
  • Monorepo, 意思是在版本控制系统的单个代码库里包含了许多项目的代码。这些项目虽然有可能是相关的,但通常在逻辑上是独立的,并由不同的团队维护。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,NXOpen::BlockStyler中也有PickPoint函数,用于在用户界面中选择一个点。BlockStyler是NXOpen API的一部分,它提供了一种创建用户界面的方法,可以将自定义功能添加到NX的工具栏和菜单中。 下面是一个使用BlockStyler中PickPoint函数的示例代码: ```cpp #include "NXOpen/BlockStyler_UIBlock.hxx" #include "NXOpen/BlockStyler.hxx" #include "NXOpen/NXMessageBox.hxx" #include "NXOpen/Part.hxx" #include "NXOpen/PartCollection.hxx" #include "NXOpen/Point.hxx" #include "NXOpen/Point3d.hxx" using namespace NXOpen; using namespace NXOpen::BlockStyler; class MyClass { public: static void OnButtonClick(const NXOpen::BlockStyler::UIBlock* block) { Part* workPart = NXOpen::Session::GetSession()->Parts()->Work(); Point* point = workPart->Points()->CreatePoint(0, 0, 0); Point3d pickedPoint = NXOpen::BlockStyler::Utilities::PickPoint(workPart); point->SetCoordinates(pickedPoint.X, pickedPoint.Y, pickedPoint.Z); workPart->ModelingViews()->WorkView()->Regenerate(); } }; extern "C" DllExport int ufusr_ask_unload() { return (int)Session::LibraryUnloadOptionImmediately; } extern "C" DllExport void ufusr(char* param, int* retCode, int paramLen) { NXOpen::Part* part = NXOpen::Session::GetSession()->Parts()->BaseWork(); NXOpen::BlockStyler::BlockDialog* dialog = NXOpen::BlockStyler::BlockDialog::Create(); NXOpen::BlockStyler::UIBlock* button = dialog->TopBlock()->FindBlock("myButton"); button->SetDouble("MinimumWidth", 120.0); button->SetHandler(MyClass::OnButtonClick); dialog->Show(); delete dialog; } ``` 在上面的示例中,我们定义了一个名为MyClass的类,并在其中定义了一个名为OnButtonClick的静态函数。在这个函数中,我们首先获取当前工作部件,然后创建一个点,并使用BlockStyler中PickPoint函数选择一个点。然后,我们将选择的点的坐标设置为点的坐标,并更新显示以查看结果。 在ufusr函数中,我们创建了一个BlockDialog,并获取“myButton”按钮的UIBlock。然后,我们设置按钮的最小宽度,并将MyClass::OnButtonClick函数指定为按钮的处理程序。最后,我们显示对话框,让用户与之交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值