pnpm 构建 Monorepo workspace项目

2023-11-13

pnpm 构建 Monorepo 项目

使用背景

因为公司要做的项目比较多,项目之间又会相互依赖。目前分为pc后台,pc商城,uniapp项目等等。所以为了代码的复用和代码的规范提交,决定引入pnpm来创建Monorepo项目。

Monorepo是什么呢(是多包单库管理)

Monorepo 简单的说,是指将公司的所有代码放到一个 Git / Mercurial / Subversion 的代码仓库中。对于很多没听说过这个概念的人而言,无异于天方夜谭。Git 仓库不应该是每个项目一个吗?对于很多用 monorepo 的公司,他们的 Git 仓库中不止有自己的代码,还包括了很多的依赖。基本上,只要把 monorepo 用 Git 拖下来,跑一下 ./scripts/install,就可以直接用 Buck / Bazel (在安装脚本中就装到了本地)编译仓库中的所有项目,并且提交修改(安装脚本配置好了代码提交环境,如果用的 Phabricator 的话,Gerrit 不用)

pnpm是什么呢

npm/yarn 采用了直接平铺的方式,而 pnpm 则是采用 .pnpm 隐藏目录隐藏真实的平铺结构,在使用链接(symbollink)的方式将真实安装的目录映射到 node_modules 下

为什么使用workspace呢

因为我们把项目剥离为业务组件层,通用api层,项目三层。项目引入通用api和业务组件相互依赖,所以我们搭建了内网npm。内网npm牵扯到了发包和版本号的问题,所以引入workspace 让项目内部进行引用类似这样

"devDependencies":{
  "**":"workspace:*"  
}

开始

第一步

我们在 packages 中新建以下几个目录。

├── packages
│   ├── ui-uniapp
│   ├── common-api

第二步

在根目录新建 pnpm-workspace.yaml,内容如下

packages:
  - 'packages/*'

第三步

npm init

生成package.json后

第四步

强制pnpm安装依赖

执行工程自身 preinstall
当前 npm 工程如果定义了 preinstall 钩子此时会被执行。

  "scripts": {
    "preinstall": "node preinstall.js",
  },

preinstall.js 中

if (!/pnpm/.test(process.env.npm_execpath || '')) {
  console.warn(
    `\u001b[33mThis repository requires using pnpm as the package manager ` +
      ` for scripts to work properly.\u001b[39m\n`
  )
  process.exit(1)
}

第五步

新增eslint stylelint prettier检测

  "scripts": {
    "preinstall": "node ./scripts/preinstall.js",
    "lint-staged": "lint-staged",
    "lint:eslint": "eslint --cache --max-warnings 0  \"packages/**/*.{vue,ts,tsx}\" --fix",
    "lint:prettier": "prettier --write  \"packages/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
    "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
    },
 "dependencies": {
    "stylelint": "^14.0.1",
    "stylelint-config-html": "^1.0.0",
    "stylelint-config-prettier": "^9.0.3",
    "stylelint-config-standard": "^23.0.0",
    "stylelint-order": "^5.0.0",
    "eslint": "^8.1.0",
    "@typescript-eslint/eslint-plugin": "^5.3.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-define-config": "^1.1.2",
    "eslint-plugin-jest": "^25.2.2",
    "eslint-plugin-prettier": "^3.1.4",
    "eslint-plugin-vue": "^8.0.3",
    "vue-eslint-parser": "^8.0.1",
    "prettier": "^2.5.1",
    "lint-staged": "^12.3.4",
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "prettier --write"
    ],
    "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
      "prettier --write--parser json"
    ],
    "package.json": [
      "prettier --write"
    ],
    "*.vue": [
      "prettier --write",
      "stylelint --fix"
    ],
    "*.{scss,less,styl,html}": [
      "stylelint --fix",
      "prettier --write"
    ],
    "*.md": [
      "prettier --write"
    ]
  }

第六步

增加git钩子
我的钩子命令是 pnpm run lint-staged

husky

npm install husky --save-dev
npm set-script postinstall "husky install"
npm run postinstall
npx husky add .husky/pre-commit " pnpm run lint-staged"
git add .husky/pre-commit

第七步

引入提交方式
安装依赖 commitizen和cz-conventional-changelog

 "scripts": {
    "commit": "cz"
  },
"config": {
    "commitizen": {
    "path": "cz-conventional-changelog"
    }
},
  • feat 增加新功能
  • fix 修复问题/BUG
  • upd 更新某功能
  • style 代码风格相关无影响运行结果的
  • perf 优化/性能提升
  • refactor 重构
  • revert 撤销修改
  • test 测试相关
  • docs 文档/注释
  • chore 依赖更新/脚手架配置修改等
  • workflow 工作流改进
  • ci 持续集成
  • mod 不确定分类的修改
  • wip 开发中
  • types 类型修改
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pnpm 构建 Monorepo workspace项目 的相关文章

  • Linux 使用npm安装pnpm成功后提示“-bash: pnpm: command not found“

    前提 xff1a 安装好nodejs xff0c 并且使用以下命令创建了软连接 xff08 报错也是由于这个原因 xff09 建立node软链接 ln s usr local nodejs bin node usr local bin 建立
  • Simulink中从Workspace中读取时序数据的方法

    1 首先 xff0c 我从adams得到是时长5秒的500组加速度数据 xff0c 将其存为txt格式 并放入matlab路径中 xff0c 其第一列为时间序号 xff0c 234列为三轴的加速度数据 2 在workspace中使用 tex
  • pnpm安装报错npm ERR code EEXIST

    pnpm安装报错 C Users admin working gt npm install g pnpm C Program Files nodejs pnpm gt C Program Files nodejs node modules
  • pnPm——比npm&yarn更胜一筹的包管理器

    官网 Fast disk space efficient package manager pnpm 安装 在 POSIX 系统上 即使没有安装 Node js 也可以使用以下脚本安装 pnpm curl fsSL https get pnp
  • pnpm修改设置下载包的存储路径

    要修改 pnpm 存储依赖的路径 可以使用 pnpm 的 store 配置选项 通过更改 store 配置 可以指定 pnpm 存储依赖的目录位置 这在希望将依赖存储在不同磁盘分区 不同的硬盘驱动器或其他自定义位置时很有用 步骤 1 打开命
  • 导入 Visual Studio TFS 工作区

    有没有办法导入 Visual Studio TFS 工作区 我有 30 多个工作区 我需要将它们导入到新计算机上的 TFS 谢谢 如果你想克隆结构的工作空间 但不要管旧的 运行 tf workspace server yourserver
  • rm(list = ls()) 在函数内不起作用。为什么? [复制]

    这个问题在这里已经有答案了 我正在尝试创建一个函数 该函数将同时清除工作区和内存 这样我就可以只键入一个函数 而不必键入 rm list ls gc 但是 rm list ls 当从函数内部调用时不起作用 为什么 有没有办法解决 gt Le
  • eclipse中不在工作区中的项目的位置

    我有多个项目存储在我的本地计算机上 但不在我正在使用的 Eclipse 工作区中 但是当我打开同一个 Eclipse 工作区时 项目就在那里 这是如何实现的 工作区的元数据中是否有一个设置指定项目的存储位置 使用这种方法而不是将项目存储在工
  • Jenkins 持续集成服务器的作业特定 SVN 签出文件夹

    我刚刚设置了一个新的 Jenkins CI 服务器 这是我昨天刚安装的最新版本 我已经完成了几个工作正常的构建 我有几个不同的存储库 它可以从中提取和构建 其中大多数适用于 NET 项目等易于在任何地方构建的项目 因此只需在工作区文件夹中签
  • pnpm 对等依赖项自动安装

    如何 或在哪个文件上 设置 true 来自动安装依赖项 我的终端错误 提示 如果您希望自动安装对等依赖项 请设置 auto install peers 设置为 true 提示 如果你不想 pnpm 在对等依赖问题上失败 设置 严格对等依赖
  • 如何创建工作区

    我们如何在 Visual Studio Code 中创建工作区 I see File菜单命令用于打开 添加文件夹和保存工作区 但没有用于创建工作区的命令 问题如何在 Visual Studio Code 中创建工作区 https stack
  • pnpm、工作区依赖以及还支持发布吗?

    我是 pnpm 工作区的新手 正在尝试解决以下问题 我的演示项目 root packages 通用用户界面 main lib common ui 是一个基于 Vite 的包 包含一些可以被其他包重用的 Vue 组件 在我的示例中它由 mai
  • Npm 工作区 - 从根包调用工作区脚本

    我正在努力处理根 git 存储库中的多个 npm 包 并使用自定义开发脚本来处理启动 编译 构建等 现在我遇到了 npm 工作区 并想在我的以下项目结构中使用这个令人惊叹的新功能 但我无法让它工作 projectx root package
  • 我如何使用 Mercurial (hg) 拥有多个工作区?

    我只是想了解 Mercurial 所以这可能是一个愚蠢的问题 打开 我希望在我的机器上编译一个程序的多个版本 例如 我可能需要在调试器中单步执行 工作版本 和 蕨 版本 直到找到不同的行为方式 我还喜欢在完成检查后签出到一个干净的工作区 这
  • 当 TFS 服务器不再存在时,如何强制删除客户端上的 TFS 2010 工作区?

    我目前在 SERVER 1 上运行 TFS 2010 服务器 在我的客户端 MY CLIENT 上 我正在运行 VS2010 并且有一个将 SERVER 1 与 MY CLIENT Development 关联的工作区 一切都很好 我正在尝
  • Java Eclipse 在保存时关闭自动构建工作区

    突然 我的 Eclipse 开始在我保存时自动构建工作区 并且仅一次保存就需要很长时间 我倾向于经常保存 以前从未这样做过 所以我想知道 如何将其关闭 If you want to turn off auto Building your p
  • Java Swing 保存和加载工作区/设置

    我有一个 Java Swing 应用程序 其中包含一堆框架 而这些框架又主要包含显示大量数据的表格 由于在启动时安排所有窗口和表格总是很麻烦且耗时 因此我想实现 工作区 功能 以便用户可以保存首选项设置并在启动时选择自动将存储的工作区加载到
  • 使用 Terraform(工作区、模块?)配置客户帐户最佳实践?

    我需要在 AWS 中创建和管理多个客户环境 并且希望利用 Terraform 来部署所有必要的资源 每个客户环境基本相同 只是用于访问其中一台服务器的 URL 不同 我已经整理了一个 Terraform 配置 可以为给定客户部署所有资源 但
  • 如何获取eclipse中的工作空间路径? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在研究PDE Eclipse Plugin Project 我需要获取工作区路径 我的文本小部件 swt 应该设置为当前工作空间路径 如
  • 在工作区中找不到文件

    我使用 Visual Studio 2010 professional 和 TFS 作为源代码控制 一切正常 早上我来打开我的解决方案 它以离线状态打开 我尝试上网 它说 Workspace for this solution could

随机推荐

  • ​LeetCode刷题实战267:回文排列II

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 回文排列II 我们先来看题面
  • Chrome启动参数大全

    原文地址 https www cnblogs com yikemogutou articles 12624113 html 序号 条件 说明 1 报告伪分配跟踪 伪跟踪从当前活动的跟踪事件派生 2 prefetch 1 prefetch 启
  • 【无标题】Unable to convert type java.lang.Character of 8 to type of java.lang.CharSequence

    服务器内部错误org mybatis spring MyBatisSystemException nested exception is org apache ibatis exceptions PersistenceException E
  • GitHub 80k星Python神级学习路线,从青铜到王者,赶紧收藏!

    Python 为什么这么火 有很多原因 列举几点 语法简单易学 其他语言 5 行代码才能实现的东西 Python 一行搞定 可以少写很多代码 因此不少同学拿 Python 刷算法题 但注意要理解算法本身哦 类库生态丰富 想做什么功能基本都有
  • 程序计数器的作用--简单易懂

    3 程序计数器 什么是程序计数器 它是干什么用的 java中程序计数器是用寄存器实现的 它的作用是寻找下一个要执行的程序 当我们的java程序被编译成二进制字节码文件后 如下图 右面 是我们写的代码 左面是二进制字节码形式 class 它们
  • FFmpeg 控制台窗口的隐藏和正常退出

    FFmpeg无疑是音视频界的翘首 很多企业或个人都会拿来使用 具体怎么使用 在此不做赘述 这里仅仅讲述如何用C 调用ffmpeg指令 以及调用的控制台窗口的正常关闭 录像或转码等情况下 非正常关闭 直接导致文件损坏 不可用 一 指令的执行
  • PID控制原理详解(一)

    PID的理解 关于理解PID控制算法最典型的一个例子就是一个漏水的水缸的问题 网上有很多讲解PID的帖子会讲到这个例子 这里我也把我自己对于PID的理解用这个例子阐述一遍 有个漏水的水缸 而且漏水的速度还不是恒定的 然后我们还有个水桶 我们
  • BES2300x笔记(14) -- 提示音模块

    哈喽大家好 这是该系列博文的第十四篇 篇 lt lt 系列博文索引 快速通道 gt gt 一 前言 提示音 的这个模块 代码量确实不小啊 这一篇 我们就来梳理一下 提示音相关接口的调用逻辑吧 二 代码调用逻辑 app voice repor
  • To see the full stack trace of the errors, re-run Maven with the -e switch.

    问题描述 微服务项目中其它模块不能依赖common模块中的依赖 而common中是有依赖的 然后重新对common进行install发现报错 原因分析 经过查找是由于common中的pom xml中有一个依赖被引入了两次 删掉其中一个即可
  • 461. 汉明距离

    题目描述 两个整数间的汉明距离是指 这两个数字对应二进制位不同的位置的数目 给定两个整数 x 和 y 计算它们间的汉明距离 注意 0 x y lt 2 31 样例 示例 输入 x 1 y 4 输出 2 解释 1 0 0 0 1 4 0 1
  • 从0到1,一文掌握用户画像标签体系

    一 标签体系概览 1 什么是对象 2 什么是标签 标签是人为设定的 根据业务场景需求 对目标对象运用一定的算法得到的高度精炼的特征标识 标签是对对象某个维度特征的描述与刻画 是某一种用户特征的符号表示 每一种标签都规定了我们观察认识描述对象
  • Redis第二十二讲 Redis高可用集群节点通信机制

    两个端口 在哨兵系统中 节点分为数据节点和哨兵节点 前者存储数据 后者实现额外的控制功能 在集群中 没有数据节点与非数据节点之分 所有的节点都存储数据 也都参与集群状态的维护 为此 集群中的每个节点 都提供了两个 TCP端口 普通端口 即我
  • 电脑上面的word文档被删除了怎么办?分享四种亲测恢复方法

    不小心把电脑里面的word文档删除了 当你需要用到这些被误删的文档后 怎么找回呢 根本不知道从何入手的小伙伴不用担心 因为办法总比困难多多 下面就让小编为大家分享word文档恢复的方法 方法均以win10系统为例进行操作 大家跟着操作将其恢
  • android.content.res.Resources$NotFoundException: String resource ID #0x1

    在Android开发中如果出现android content res Resources NotFoundException String resource ID 0x1这样的错误 你想也不用想 一定是Textview控件显示数据出了问题
  • 某公众号登录加密(webpack)

    前言 随手记 1 本文章仅作学习参考使用 不做其他使用 网站 aHR0cHM6Ly9tcC53ZWl4aW4ucXEuY29tLw 输入密码 分析抓包信息 如下 可以初步判断是一个md5的密文数据 使用全局搜索Search定位到加密位置下断
  • 使用国内镜像源在线安装QT Mac M1

    参考 使用国内镜像源在线安装QT 2023 3 25更新 qt国内镜像 Iotfsd的博客 CSDN博客 网上搜了一些资料 大多数建议用fiddler代理 Mac M1操作不起来 看到上述windows的方法 尝试了一下 运气很好成功了 大
  • 闭环系统的零极点图判定稳定性_系统的稳定性判别

    pzmap 函数可以绘制连续系统在复平面内的零极点图 其调用格式如下 p z pamap num den 或 p z pzmap A B C D 或 p z pzmap p z 其中列向量 p 为系统的极点 列向量 z 为系统的零点 num
  • SQLilabs的第20关(HTTP请求头-Cookie)——报错注入

    1 判断闭合方式 我们在cookie的后面加上一个 返回页面如下 我们再将 改成 返回页面如下 这说明闭合方式是 2 确定注入方式 我们在判断闭合方式时发现 该网站会返回报错信息 又没有回显 因此适合使用报错注入 3 爆破数据库名 用户名
  • opencv中morphologyEx()函数

    opencv中morphologyEx函数 函数原型 参数解释 例子 相关函数 参考博客 函数原型 CV EXPORTS W void morphologyEx InputArray src OutputArray dst int op I
  • pnpm 构建 Monorepo workspace项目

    pnpm 构建 Monorepo 项目 使用背景 因为公司要做的项目比较多 项目之间又会相互依赖 目前分为pc后台 pc商城 uniapp项目等等 所以为了代码的复用和代码的规范提交 决定引入pnpm来创建Monorepo项目 Monore