当前位置: 首页 > article >正文

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建


1 ) 缓存工作原理分析

  • 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。
  • 以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。

2 ) 远程缓存的机制与优势

  • 参考 Nx 的官方文档,远程缓存与可遍历缓存类似。
  • 当使用本地构建命令时,系统会检查远程是否存在对应文件,若有则利用该缓存下载到本地,辅助其他构建任务,省去部分包的构建成本,提升构建速度。

3 )实现远程缓存的步骤

  • Lerna 与 Nx 的关系:Lerna 本身没有缓存能力,而是借助 Nx 内置命令实现了缓存和远程缓存功能
  • 连接远程缓存:使用 nx connect 连接到指定端点,即可使用远程缓存。
  • 登录 Nx Cloud:打开 Nx App 网站(即 Nx Cloud),点击右上角“Sign in”,可以使用 GitHub 账号登录。
  • 默认情况下,新用户没有组织(Organization),免费用户可创建一个组织,一个组织下可创建一个免费的工作区(Workspace)。

4 )远程缓存的实践操作

  • 连接工作区:执行 npx nx connect 命令,按照提示操作,连接到 Nx App 创建工作区。若提示无 nx modules,安装 nx -d -w 。安装完成后再次执行NPX NX connect,根据提示操作,进度条走完后会自动跳转到workspace。完成连接后,系统会自动跳转到工作区页面。

  • 构建项目测试:使用 package.json 中的 run build 命令构建项目,完成后可查看缓存文件。再次执行“npm lerna rebuild”(未删除缓存文件),会从本地读取缓存

  • 重置缓存测试:执行 nx reset 命令重置远程工作区的缓存,再次执行构建命令,系统会重新生成缓存

  • 模拟协作开发:在新目录下安装依赖,执行 npx nx build head 命令,系统会从远程缓存读取输出,实现缓存复用

5 ) 用户权限与使用限制

  • 访问权限
    • 用户可通过创建访问令牌(Access Token)或添加成员(Members)的方式,让其他开发者访问工作区。
    • 使用 token 方式:可通过点击“workspace”的“settings”,选择“manage tokens”,创建“access token”,复制给其他小伙伴使用。也可配置“members”,他们拥有访问“workspace”和创建“access token”的权限。
    • 免费用户可拥有 30 个贡献者(Contributors),进阶版本每月可拥有 50 个。
  • 使用限制
    • 免费版 Nx App 用户数量不限,但每个用户只能创建一个组织
    • 此外,Nx Runs(最大执行脚本数量)限制为 5 万个

6 )其他缓存方案探索

  • 若想使用自定义缓存,可在 NPM 上搜索相关包,有开发者创建了连接不同服务商(如 S3、谷歌等)的缓存方案。
  • 相比之下,Nx 的开放性优于 Lerna。在使用 Nx 时,可通过 npx nx reset 重置工作区,执行 npx nx run-many --target=build 命令测试远程缓存效果,首次构建可能受网络影响耗时较长,后续构建则速度较快。

NX Cloud扩展能力解析:Agents等功能介绍与应用


一、NX与其他工具对比及NX Graph功能

  • 经过前面的实践,大家可能会感觉NX和前面的Gradle区别不大

  • 虽然有了某种支持后,NX对于版本管理表现不错,但它的优势究竟在哪里呢?

  • 对于特别复杂的企业级应用,NX提供了Graph功能。大家可以选择NX,然后点击“Explore Graph”,直接使用NX Graph就能查看项目中的依赖关系。

  • 通过这样的关系图表,能非常清晰地看到项目中各个模块对具体包的使用情况。

  • 如果项目很复杂,使用这个可视化图表可以方便我们快速了解项目结构,这是NX第一个非常亮眼的功能。

二、Remote Caching及NX Agents功能

  • 第二个功能是Remote Caching,之前已有提及。现在来说第三个很强大的功能。
  • 目前,NX还未完全开放NX Agents功能,它属于NX Cloud的一部分。
  • NX Agents相当于我们在运行Jacons或者 GitHub Actions 时,可以创建多个并行任务。官方云服务提供了一些代理,可用于运行NX构建任务。
  • 其代理功能或特性在于能够进行分布式任务(Distributed Task),这是整个CLI自带的功能,它将生态与云服务相结合,非常酷。
  • 当与NX Cloud结合运行任务时,如果结合自己的CLI Provider,比如运行构建、测试等任务,整个流程可以交由自己的CI Provider,比如Jenkins或者Bitbucket Pipelines会有自己的Workers或Runners,运行特定脚本,再由NX Cloud进行分发。也可以全权交由 NX Cloud Workloads,它会创建这些Agents。
  • 不过,使用这些资源需要付费。其好处是可以使用Agents产生的制品文件,加速整个构建过程。

三、与Git Actions结合的流程及加速效果

  • 在官方文档的CI部分,选择“Recipes”,其中有一个“Setting up GitHub Actions”。

  • 这里有几个菜单,先介绍第一个“Process only affected projects with one job on GitHub Actions”。

  • GitHub Actions会产生一些制品,我们可以在一个GitHub Action的任务中,运行那些已被修改的项目。

  • 其Actions配置较为清爽,首先“Checkout”读取对应代码,然后配置Node环境,安装依赖,接着执行“NX Cloud Record”记录对应内容,之后“NX Affected”运行对应任务,最后并行执行任务。

  • 这个Action会获取最后一次构建主分支上的内容,对比缓冲文件,加速后续构建过程。对于一些前端同学来说,面对众多工具包、环境和CICD流程,可能会对NX的出现感到困惑。

  • 但实际上,NX的作用很明显,比如我们使用PNPM加速安装包过程,在国内还会使用淘宝源。而NX Cloud能加速构建过程,原本未使用缓存时构建花费11秒,配合NX Cloud缓存后降到2秒。

  • 官方文档的配置存在一些问题,修改后放在课程资料文件夹里。对于Mitab项目,不能使用NPM CI,而要使用PNPM,配合GitHub Actions的PNPM缓存加速,可快速构建项目。除了GitHub Actions,还可与其他工具整合,原理类似,都是借助NX Cloud的构建缓存能力加速构建。

四、分布式任务菜单及NX Agents发布情况

第二个菜单是“Distribute tasks across agents on GitHub Actions”,需要设计分布式任务,执行特定命令会产生配置文件

NX 团队协同提效新方案


借助 Azure 存储构建缓存的申请、配置与权限管理


1 ) 背景与问题提出

  • 前面我们介绍了 Nx 这类自动化构建工具,它能为我们带来本地化缓存或云端缓存。
  • 虽然 Nx 比 Turborepo 要好,其自动化缓存,包括远端缓存的实现也较为流畅,但深入思考会发现存在一些问题。
  • 一个项目可对应一个 workspace,项目中也能对应多个 Monorepo 项目,免费账户基本够用。然而,当公司有多个项目需要协同开发时,会发现 Turborepo 和 Nx 的远端缓存收费较贵。
  • 以 Nx 为例,其 Pro 会员每月 75 美元,支持 Nx Agents 和 Nx Workflows,但目前 Nx Agents 仅处于 Review 版本,尚未全面铺开,Nx Workflows 也是如此。
  • 对于绝大多数中小企业来说,Nx 的入门版本和进阶版本价格偏高。实际使用中,我们用到的功能可能与 GitHub Actions 类似,主要是 CI 和远端缓存,而远端缓存对构建有一定的提速效果。
  • 若团队内部有多个前端项目需使用 Nx 工具实现构建缓存加速,该如何解决呢?
  • 有同学提出使用 Turborepo 或注册多个 Nx 账号,但在开发不同项目时切换账号较为麻烦。还有同学想在团队内部使用共享存储或用 bat 文件上传.nx 文件实现共享,但这种方式存在问题,因为项目代码修改后,.nx 文件共享困难,且文件不是实时更新的,可能会导致项目出现 bug。

2 ) 解决方案探索

  • 我们之前介绍 Nx 缓存时,提到过一个项目叫 @nx-tools/remote-cache-custom,它可自定义缓存,是核心包。其作者还开发了 @nx-tools/remote-cache-azure,这是基于微软云服务的项目。@nx-tools/remote-cache-custom 暴露了三个钩子方法:

      1. findExisting:当文件存在时,后续的逻辑处理。
      1. retrieveFile:发现文件后,下载对应的文件。
      1. storeFile:与远端文件比对,若文件不存在,则存储文件。
  • 若要自定义缓存,需读取对应的接口。在 Nx 生态中,已有相关工具,如 liveindexPS 直接从 @nx-tools/remote-cache-custom 中读取 createCustomRunner 并初始化环境变量。

  • createCustomRunner 会获取一个客户端,该客户端会拼接存储中的用户信息、workspace 容器信息以及上传或下载文件的信息,以此判断存储中是否有对应文件。

  • 自定义存储后,团队可创建多个存储空间,不同的存储空间对应不同项目,使用相同的远端存储实现项目存储共享。

3 ) 实践操作步骤

  1. 云服务申请与存储账户创建
    • 微软提供的云服务可免费试用,包含存储服务。点击免费试用后,在查看服务中选择查看所有免费服务,能找到存档存储。
    • 注册账号需绑定国内信用卡,可选择中国地区。登录后,点击创建资源,搜索存储账户并选择创建。新注册用户有免费试用名额,需新建资源组,存储账户名称尽量简单,如 “toMC”。区域选择方面,若在公司内部使用,建议选择与国内较近的区域,如日本、韩国或亚洲东部;若对成本敏感,可选择美国的区域。性能选择标准即可,启用分层命名空间,网络选择所有网络的公共访问,数据保护部分保持默认。创建完成后,会得到一个存储账户。
  2. 创建容器
    点击进入存储账户,创建对应的容器,如 “NXworkspace”,为方便测试,可将其名称改为 “demo”。
  3. 项目配置
    • 选择一个空项目,初始化 repo、nx 和 lerna,安装项目依赖后,使用 pnpm install @nrwl/nx-cloud -d -w 安装,再用 npx nx init 初始化 Nx 配置文件,配置缓存任务为 build 和 test。
    • 安装 @nx-tools/remote-cache-azure,将配置信息复制到项目的 nx.json 文件中。必填的四个选项为:
      • accountName:存储账户名称。
      • accountKey:在存储账户的左侧点击访问密钥,复制其中一个密钥。
      • container:容器名称,即 “NXworkspace-demo”。
  4. 验证与测试
    • 使用 npx nx run-many -t build 执行构建任务,并将结果缓存到远端。执行前,容器内无内容,执行后,会推送压缩后的文件。
    • 清除本地缓存后再次执行构建任务,会提示使用远端缓存。
  5. 权限配置
    • 为控制权限,可针对容器设置权限。在容器左侧点击共享访问令牌,配置读取、写入等权限和所有权,设置有效期后生成 SAS URL。将不需要的 accountNameaccountKey 删除,仅保留 container。调整权限后再次构建,可验证权限设置效果。
    • 团队其他成员可将 Nx 的配置文件上传到服务器,使用 .nx 文件读取配置。在不同机器上测试,可验证构建效果。

总结

  • 本文介绍了使用 Nx 配合微软 Azure 云服务加速项目构建的过程,包括注册云服务、配置存储服务、创建容器、配置项目和设置权限等步骤
  • 配置用户访问容器有两种方式
    • 一是提供密钥,用户可操作整个存储账户空间
    • 二是使用容器的共享令牌功能,可控性更好,可设置权限和有效期

相关文章:

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...

32单片机——基本定时器

STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的​​亮度(或…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...