monorepo + Turborepo --- 开发应用程序

目录

配置开发任务

在 `dev` 之前运行设置任务

运行特定应用程序

使用终端 UI

与任务交互

监听模式

watch

将 turbo watch 与持久任务一起使用

依赖感知的持久任务

没有依赖感知的持久任务

缓存

任务输出

局限性


在 Monorepo 中开发应用程序可以解锁强大的工作流程,使你能够进行原子提交到源代码控制,并轻松访问代码。

大多数开发任务都是长时间运行的任务,它们会监视代码的更改。Turborepo 通过强大的终端 UI 和其他功能(例如)增强了这种体验

配置开发任务

在 `turbo.json` 中定义一个开发任务会告诉 Turborepo 你将要运行一个长时间运行的任务。这对于运行开发服务器、运行测试或构建应用程序等操作非常有用。

要注册一个 `dev` 任务,请将其添加到你的 `turbo.json` 中,并带有两个属性

{"tasks": {"dev": {"cache": false,"persistent": true}}
}
  • "cache": false: 告诉 Turborepo 不要尝试缓存任务的结果。由于这是一个开发任务,你可能会频繁更改代码,因此缓存结果没有用处。
  • "persistent": true: 告诉 Turborepo 让任务持续运行直到你停止它。这个键作为终端 UI 的信号,将该任务视为长时间运行且可交互的任务。此外,它可以防止你意外地依赖于一个不会退出的任务。

现在你可以运行你的 `dev` 任务以并行启动你的开发脚本

turbo dev

在 `dev` 之前运行设置任务

你可能还想运行一些脚本来设置你的开发环境或预构建软件包。你可以使用 `dependsOn` 确保这些任务在 `dev` 任务之前运行

{"tasks": {"dev": {"cache": false,"persistent": true,"dependsOn": ["//#dev:setup"]},"//#dev:setup": {"outputs": [".codegen/**"]}}
}

在这个例子中,我们使用了 根任务,但你也可以将相同的想法用于 软件包中的任意任务。

运行特定应用程序

`--filter` 标志允许你选择你的 软件包图 的子集,以便你可以为特定的应用程序及其依赖项运行你的 `dev` 任务

turbo dev --filter=web

使用终端 UI

Turborepo 的终端 UI 启用了一些功能,这些功能围绕你的任务创建了高度交互的体验。

自定义你的视图

你可以使用快捷键快速调整 UI 以满足你的需求。

与任务交互

你的一些工具可能允许你向其中键入输入。例如 Drizzle ORM 的交互式迁移或 Jest 的测试套件的过滤和重新运行。

你可以与 标记为交互式 的任务进行交互,以便向它们提供输入。

persistent

将任务标记为 persistent 以防止其他任务依赖于长时间运行的进程。 默认情况下,持久任务是 交互式 的。

{"tasks": {"dev": {"persistent": true}}
}

由于长时间运行的进程不会退出,因此依赖于它的任务永远不会运行 一旦你将任务标记为持久,如果其他任务依赖于它,turbo 将抛出错误。

监听模式

许多工具都有内置的监听器,例如 `tsc --watch`,它们会对源代码中的更改做出响应。但是,有些工具没有。

`turbo watch` 为任何工具添加了一个依赖项感知的监听器。源代码的更改将遵循你在 `turbo.json` 中描述的 任务图,就像你的所有其他任务一样。

例如,使用像 `create-turbo` 这样的包结构,以及以下任务和脚本

{"tasks": {"dev": {"persistent": true,"cache": false},"lint": {"dependsOn": ["^lint"]}}
}

}

当你运行 `turbo watch dev lint` 时,你会看到每当你更改源代码时,`lint` 脚本都会重新运行,尽管 ESLint 没有内置监听器。`turbo watch` 也知道内部依赖关系,因此 `@repo/ui` 中的代码更改将重新运行 `@repo/ui` 和 `web` 中的任务。

`web` 中的 Next.js 开发服务器和 `@repo/ui` 中 TypeScript 编译器的内置监听器将继续像往常一样工作,因为它们被标记为 `persistent`。

watch

基于代码更改,重新运行仓库中的任务。

turbo watch [tasks]

turbo watch 具有依赖感知能力,意味着任务将按照 在 turbo.json 中配置的顺序 重新运行。

如果没有提供任务,turbo 将显示仓库中软件包可用的任务。、

turbo watch

将 turbo watch 与持久任务一起使用

持久任务标记为 "persistent": true,意味着它们不会退出。因此,它们不能在你的任务图中被依赖。

这意味着当使用 turbo watch 时,持久任务将被忽略,其工作方式与 turbo run 相同,允许同时运行持久任务和非持久任务。

依赖感知的持久任务

当你的脚本具有内置的监视器(如 next dev),能够检测依赖项中的更改时,你不需要使用 turbo watch。 相反,使用脚本的内置监视器并将任务标记为长时间运行,使用 "persistent": true。

没有依赖感知的持久任务

某些工具对 monorepo 不友好,并且不热重载依赖项中的模块。 在这些情况下,你应该将任务标记为 interruptible: true,以便在检测到相关更改时,turbo watch 重新启动任务。

turbo watch 监视你的包的更改并自动重新启动受影响的任务。 但是,如果任务是持久的,则默认情况下不会重新启动。 要启用重新启动持久任务,请将 interruptible 设置为 true

缓存

使用 Watch Mode 缓存任务目前是实验性的,在 --experimental-write-cache 标志下。

turbo watch your-tasks --experimental-write-cache

任务输出

如果你的任务写入检入到源代码控制的文件,则 Watch Mode 有可能进入无限循环。 这是因为 Watch Mode 监视你的文件更改,并将重新运行已更改软件包中的任务。 如果任务创建了更改,那么这将再次触发该任务。

Watch Mode 具有一些逻辑来防止这种情况发生,使用文件哈希,但这并非万无一失。 为了避免这个问题,我们建议从 git 中删除任何任务输出。 

局限性

清理任务

在某些情况下,你可能希望在 `dev` 任务停止时运行一个脚本。Turborepo 无法在退出时运行这些清理脚本,因为当你的 `dev` 任务退出时,`turbo` 也会退出。

相反,创建一个 `turbo dev:teardown` 脚本,在你退出主要的 `turbo dev` 任务后单独运行它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88111.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#字符串相关库函数运用梳理总结 + 正则表达式详解

C# 字符串常用库函数总结 🔹 1. 字符串比较 方法说明示例string.Equals()比较两个字符串是否相等(可忽略大小写)string.Equals("abc", "ABC", StringComparison.OrdinalIgnoreCase) / !判断两个字符串是否相等/不等&quo…

投机采样(Speculative Decoding)

投机采样(Speculative Decoding) 是一种加速大型语言模型(LLM)推理的技术,其核心思想是通过预生成候选token序列并异步校验,从而减少主模型的计算量,同时保持生成结果的准确性。 核心思想是通过…

如何将华为手机中的照片传输到电脑

华为手机在众多手机品牌中以其出色的品质脱颖而出,尤其是其摄像头功能。有时,你可能在华为手机上积累了太多有意义的照片,想要将这些照片上传到电脑以释放手机存储空间。然而,出于用户信息安全的考虑,一些便捷的方法可…

whitt算法之特征向量的尺度

whitt中特征值不相等判别条件另一个条件的意思, 实际上这两个条件都没用,不用看,特征值排序,如果现在顺序对λ1/λ1‘ w λ2/λ2 -w 此时取相位就是0,最小了 如果相反就是面的是0我的代码用最优相位内积去交换位置公…

【Note】《深入理解Linux内核》 第十九章:深入理解 Linux 进程通信机制

《深入理解Linux内核》 第十九章:深入理解 Linux 进程通信机制(Process Communication)关键词:IPC、信号、管道、FIFO、消息队列、信号量、共享内存、套接字、内核对象、同步机制一、进程通信概述 1.1 为什么需要进程通信 在 Linu…

【Mac 从 0 到 1 保姆级配置教程 19】- 英语学习篇-我的英语工作流分享(AI 辅助学习)

文章目录前言听力沉浸式翻译阅读Easydict配置自定义字典(重点)欧陆词典沙拉查词沉浸式翻译写作Eearthworm英文提问口语最后学习资料系列教程前言 本文介绍一下我日常如何学习和使用英语的工作流,包括一些常用好用的工具,好的工具…

从库函数到API接口,深挖不同语言背后的“封装”与“调用”思想

个人主页-爱因斯晨 优秀文章推荐 文章目录个人主页-爱因斯晨优秀文章推荐引言一、三种调用机制概述C语言的库函数Python 的导包机制Java 的 API 接口调用综上:二、它们的相同点:封装与调用三、不同之处**对比核心维度****细节串讲**1. **C 语言&#xf…

基于NCNN框架在Android平台实现YOLOv8目标检测模型的高效部署与实践

随着移动设备计算能力的提升,越来越多的深度学习模型被部署到移动端,以实现实时、低延迟的应用场景。YOLO系列的在目标检测任务中表现出色,具有精度高、速度快的优势。本文将详细介绍如何基于NCNN框架 ,在Android平台 上高效部署Y…

华为动态路由配置

问题描述:针对四个路由器在不同的网段场景中,对四个路由器进行动态路由配置。下面以如下场景为例,介绍详细配置过程。配置过程: 1、每个路由器的接口配置IP地址 路由器AR1中每个接口配置IP地址。 sys # 进入系统视图 interface g…

分布式事务解决方案(三)

在Java分布式系统领域,传统强一致性方案(如2PC、3PC)在高并发、复杂业务场景下暴露出性能瓶颈和阻塞问题。而Saga模式与事件溯源(Event Sourcing)作为更具弹性和扩展性的解决方案,逐渐成为分布式事务处理和…

【时时三省】(C语言基础)通过指针引用数组

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省数组元素的指针一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然…

【WEB】Polar靶场 21-25题 详细笔记

二十一.php very nicephp又是你 ,但是经过这么多次折磨后我感觉我已经有一点抗性了老规矩,先看知识点PHP 序列化是将 PHP 变量(如对象、数组)转换为字符串的过程,便于存储或传输。反序列化则是将字符串还原为原始变量。这在缓存、…

【Guava】1.0.设计虚拟机的方向

【Guava】1.0.设计虚拟机的方向虚拟机是什么?栈式虚拟机栈式虚拟机的优缺点题外话虚拟机是什么? 虚拟机(VirtualMachine, VM)是一种计算机程序或系统,它通过软件模拟物理计算机的硬件运行环境,使得多个操作…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的高校实验室资源综合管理系统,推荐!

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本高校实验室资源综合管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大…

Spring Boot:影响事务回滚的几种情况

一、Controller 捕获异常导致事务失效 需求 我们有一个用户注册服务,注册时需要: 创建用户账户分配初始积分发送注册通知 这三个操作需要在同一个事务中执行,任何一步失败都要回滚。 错误示例:Controller 捕获异常导致事务失效 Re…

如何避免分布式爬虫被目标网站封禁?

在分布式爬虫的大规模数据采集场景中,避免被目标网站封禁的核心逻辑是:通过技术手段模拟真实用户行为,降低爬虫行为的可识别性,同时建立动态适配机制应对网站反爬策略的升级。以下从请求伪装、行为控制、资源管理、反爬对抗四个维…

Maven 打包排除特定依赖的完整指南(详细方法 + 示例)

前言 在使用 Maven 构建 Java 项目时,我们常常需要对项目的打包过程进行精细化控制,尤其是希望排除某些特定的依赖库。这可能是为了减小最终构建产物的体积、避免版本冲突,或者仅仅是为了满足不同环境下的部署需求。 本文将详细介绍如何在 Ma…

Terraform `for_each` 精讲:优雅地自动化多域名证书验证

大家好,在云原生和自动化运维的世界里,Terraform无疑是基础设施即代码(IaC)领域的王者。它强大的声明式语法让我们能够轻松地描述和管理云资源。然而,即使是经验丰富的工程师,在面对某些动态场景时也可能会…

C++标准库中各种互斥锁的用法 mutex

示例 仅供参考学习 #include <mutex> #include <shared_mutex> #include <thread> #include <chrono> #include <iostream> #include <vector>// // 1. std::mutex - 基本互斥锁 // void basic_mutex_example() {std::mutex mtx;int cou…

Android Handler机制与底层原理详解

Android 的 Handler 机制是跨线程通信和异步消息处理的核心框架&#xff0c;它构成了 Android 应用响应性和事件驱动模型的基础&#xff08;如 UI 更新、后台任务协调&#xff09;。其核心思想是 “消息队列 循环处理”。 核心组件及其关系Handler (处理器): 角色: 消息的发送…