内网 monorepo 配置指南(PNPM、YARN、Rush.js)

news2024/12/28 4:14:06

此处的内网是指没办法连接互联网进行依赖下载的环境,本文以windows平台为例

背景说明

绝大部分政府机关、国有企业都是在内网开发,无法从互联网同步依赖,就需要另辟蹊径解决项目依赖的问题。

传统的单包项目还好,从互联网机器将依赖下载,打包拷贝到内网就能直接跑起来。

monorepo 项目相对而言复杂一些,下面我将介绍工作中用到的内网 monorepo 方案。

何为 monorepo

Monorepo 是一种项目代码管理方式,指单个仓库中管理多个项目,有助于简化代码共享、版本控制、构建和部署等方面的复杂性,并提供更好的可重用性和协作性。Monorepo 提倡了开放、透明、共享的组织文化,这种方法已经被很多大型公司广泛使用,如 Google、Facebook 和 Microsoft 等。

上面的文案摘自带你了解更全面的 Monorepo - 优劣、踩坑、选型有详细介绍 😀。

基于 YARN

yarn workspaces 是 yarn 提供的 monorepo 的依赖管理机制,从 1.0 开始默认支持,用于在代码仓库的根目录下管理多个package的依赖,详见:yarn workspaces

基本配置

{
  "private":"true", //必填,否则不能开启工作区功能
  "workspaces": [
    "packages/*",   //告知 yarn 在 packages 下的文件夹均为包
  ],
  "scripts": {
    "webpack": "yarn workspace ui-webpack serve",
    "vite": "yarn workspace ui-vite serve"
  }
}

packages 下新建包,并配置 package.json (可以用 yarn init -y 快速初始化, name 属性必填)。整体目录如下图所示:

在这里插入图片描述

此时可以执行 yarn workspaces info 查看工作区结构

# yarn workspaces info
yarn workspaces v1.22.19
{
  "@app-meta/basic-vue3": {
    "location": "packages/basic-vue3",
  },
  "ui-vite": {
    "location": "packages/ui-vite",
    "workspaceDependencies": [
      "@app-meta/basic-vue3"
    ]
  },
  "ui-webpack": {
    "location": "packages/ui-webpack",
    "workspaceDependencies": [
      "@app-meta/basic-vue3"
    ]
  }
}

安装依赖

直接执行yarn即可完成依赖(统一存放在 node_modules 下)。

此时观察子包的目录,发现都有创建 node_modules\.bin 目录,里面是用到的命令行(如 webpackvite),可删除(不影响命令执行)。

启动项目

  • yarn workspace ui-webpack serve

迁移到内网

将整个工程目录node_modules拷贝到新机器即可,简单快捷。

创建目录联接

此时 node_modules 下的依赖没有联接需要手动创建

  1. 删除 node_modules/@app-meta 目录
  2. 执行 mkdir ./node_modules/@app-meta && mklink /J .\node_modules\@app-meta\basic-vue3 .\packages\basic-vue3
  3. 其他的联接类似

利用 yarn 也可以创建联接:

  1. yarn workspace @app-meta/basic-vue3 link
  2. yarn link “@app-meta/basic-vue3”

基于 PNPM

关于配置

# .npmrc
# 我尝试了各种配置,结果发现如下配置最能打
shamefully-hoist=true

新建包

  1. CTRL+C、CTRL+V 新建一个包,并修改 package.json 的包名
  2. 此时发现 node_modules 内的依赖都是空的,若此时执行 pnpm i --offline 会报错
 ERR_PNPM_NO_OFFLINE_META  Failed to resolve xxxxx
  1. 我们更新下 pnpm-lock.yaml 文件的引用即可

在这里插入图片描述

迁移到内网

由于 pnpm 使用的是软链接,直接拷贝工程目录在新机器不能正常跑起来 🤣(如有更好的方案烦请告之哈)

  1. store-dir目录(可通过pnpm config get store-dir命令查看)拷贝到内网机器
  2. 在新机器上设置 store-dir
  3. 在工程目录下执行 pnpm i --offline
  4. OK

这里不得提一下,此方案如果遇到多人协作开发,则需要在各个机器上重复操作,碰到依赖版本更新会很难受😢。

问题汇总

  1. vite 启动正常,运行时报错

场景
将联网机器中的项目(带依赖)拷贝到内网,webpack能正常使用,vite 启动正常运行时去提示以下错误

Uncaught SyntaxError: The requested module '/@fs/.../node_modules/highlight.js/lib/core.js?v=bdf51948' does not provide an export named 'default' (at core.js?v=bdf51948:2:8)

此时需要重新执行pnpm i --offline

  1. pnpm-lock.yaml 文件

此文件被删除后,执行pnpm i --offline会报下面的错

 ERR_PNPM_NO_OFFLINE_META  Failed to resolve vue-loader@>=15.9.7 <16.0.0-0 in package mirror...

基于 Rush.js(微软出品)

Rush makes life easier for JavaScript developers who build and publish many NPM packages at once. If you’re looking to consolidate all your projects into a single repo, you came to the right place! Rush is a fast, professional solution for managing this scenario.

我还没试验过(在内网安装 rush 都不容易哈哈),有兴趣的同学可以尝试下,这里有参考文章:基于Rush.js的Monorepo实战。

总结

这里局限地介绍了我用过的 monorepo 内网管理办法,我个人推荐yarn方案,简单便捷且对更新依赖友好,希望对大家有所帮助。

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

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

相关文章

音视频技术开发周刊 | 294

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 五问「ChatGPT医学影像」&#xff1a;新一代的 AI 能否成为放射科医生的一把利器&#xff1f; 在医学等专业性较强的领域内&#xff0c;ChatGPT的表现还不够好&#xff0c…

Linux 防火墙 SNAT DNAT

SNAT原理与应用 SNAT 应用环境 局域网主机共享单个公网IP地址接入Internet &#xff08;私有IP地址不能在Internet中正常路由&#xff09; SNAT原理 修改数据包的源地址 SNAT可以认为是路由器NAT中的easy ip DNAT可以认为是路由器NAT中的 nat server SNAT将 内网源地址 转化为网…

【Vue2.0源码学习】虚拟DOM篇-Vue中的DOM-Diff

1. 前言 在上一篇文章介绍VNode的时候我们说了&#xff0c;VNode最大的用途就是在数据变化前后生成真实DOM对应的虚拟DOM节点&#xff0c;然后就可以对比新旧两份VNode&#xff0c;找出差异所在&#xff0c;然后更新有差异的DOM节点&#xff0c;最终达到以最少操作真实DOM更新…

FasterRCNN训练自己的数据集

2016年提出的Faster RCNN目标检测模型是深度学习现代目标检测算法的开山之作&#xff0c;也是第一个真正全流程都是神经网络的目标检测模型。 其主要步骤如下&#xff1a; 1&#xff0c;使用CNN对输入图片提取feature map. 2&#xff0c;对feature map上的每个点设计一套不同大…

Roboflow的使用

文章目录 前言一、使用labelimg标注数据集二、导入roboflow1.注册roboflow账户2.导入图片2.1 创建工作区workspace&#xff08;非必须&#xff09;2.2 创建项目 project2.3 导入 3、导出图片4、同一个数据集可以导出不同类型 前言 我自己也是一个小白不是很会&#xff0c;如果…

ASO优化之怎么做好关键词本地化覆盖

如果想要我们的应用走向国际化&#xff0c;被多个国家/地区使用&#xff0c;那么做好关键词本地化覆盖至关重要。我们可以主要针对中文和英文进行设置&#xff08;准备两套元数据&#xff09;&#xff0c;这样能够迅速增加应用商店ASO关键词覆盖数量。 那么我们要在哪里设置&a…

小白也能懂的薛斯通道抄底指标以及公式(附源码)

什么是薛斯通道&#xff1f; 上个世纪70年代&#xff0c;美国人薛斯最早发明了薛斯通道。 他本人曾是研究火箭运行的。 薛斯通道包括两组通道指标&#xff0c;分别是长期大通道指标&#xff08;100天&#xff09;和短期小通道指标&#xff08;10天&#xff09;。 股价实际上是被…

Netflix 团队解决了 Linux 内核中的 FUSE 死锁

Laf 公众号已接入了 AI 绘画工具 Midjourney&#xff0c;可以让你轻松画出很多“大师”级的作品。同时还接入了 AI 聊天机器人&#xff0c;支持 GPT、Claude 以及 Laf 专有模型&#xff0c;可通过指令来随意切换模型。欢迎前来调戏&#x1f447; <<< 左右滑动见更多 &…

Go与神经网络:张量运算

0. 背景 2023年年初&#xff0c;我们很可能是见证了一次新工业革命的起点&#xff0c;也可能是见证了AGI(Artificial general intelligence&#xff0c;通用人工智能)[1]孕育的开始。ChatGPT应用以及后续GPT-4大模型的出现&#xff0c;其震撼程度远超当年AlphaGo战胜人类顶尖围…

微信小程序-页面跳转wxAPI

官方文档地址&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html wx.navigateTo(Object object) 更改首页代码&#xff0c;添加一个按钮&#xff0c;绑定一个事件的点击&#xff1a; <!--index.wxml--> <text>首页</t…

《前端》HTML常用标签

文章目录 HTML导读HTML格式常用标签标题标签段落标签格式化标签超链接标签标签的几种形式 表格标签列表标签表单标签按钮标签无语义标签 ​&#x1f451;作者主页&#xff1a;Java冰激凌 &#x1f4d6;专栏链接&#xff1a;前端 HTML导读 html是超文本标记语言 一般直接运行在…

33从零开始学Java之方法的递归调用到底是怎么回事?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在之前的文章中&#xff0c;壹哥给大家讲解了方法的定义、调用及参数、返回值等内容&#xff0c;接下…

广告行业中那些趣事系列62:keybert在实际业务中的使用分享

导读&#xff1a;本文是“数据拾光者”专栏的第六十二篇文章&#xff0c;这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇作为之前keybert的补充主要介绍了keybert在实际业务中的使用分享&#xff0c;对于希望在实际业务场景中使用keybert的小伙伴可能有帮助。 欢…

微信小程序-页面生命周期方法

在经过上一篇文章的介绍之后&#xff0c;我们知道了大体的生命周期在什么时候执行&#xff0c;这次主要是以代码的形式来展示一下具体的阶段执行什么生命周期方法。 首先我们编写一个代码可以从首页跳转到日志页面&#xff1a; <!--index.wxml--> <text>首页</t…

项目中excel表格中由合同内容--转换为验收清单的办法(python操作excel表格)

需求&#xff1a; 把合同内容--转换为验收清单的办法&#xff08;python操作excel表格&#xff09; 1.字段重新排序 2.选择需要的表格列 原始的表格内容&#xff1a; 需要的格式&#xff1a; 涉及的技术点&#xff1a; 1.读取原始表格“readexcel1.xlsx”内容&#xff0c;修改…

第十一章 Productions最佳实践 - 生产电子表格

文章目录 第十一章 Productions最佳实践 - 生产电子表格生产电子表格界面设计 第十一章 Productions最佳实践 - 生产电子表格 生产电子表格 维护一个电子表格是很有帮助的&#xff0c;它可以逐个应用程序地组织信息系统。作为一般准则&#xff0c;应该为每个提供传入或传出数…

# 性能诊断 JProfiler 工具使用

性能诊断 JProfiler 工具使用 JProfiler是一个重量级的JVM监控工具&#xff0c;提供对JVM精确监控&#xff0c;其中堆遍历、CPU剖析、线程剖析看成定位当前系统瓶颈的得力工具。可以统计压测过程中JVM的监控数据&#xff0c;定位性能问题。 官网地址&#xff1a;Java Profiler…

初识linux之网络基础概念

目录 一、网络发展 1. 独立模式 2. 网络互联 二、认识协议 1. 为什么要有协议 2. 什么是协议 三、网络协议初识 1. 协议分层 2. 协议分层的优点 3. 理解分层 4. OSI七层模型 4.1 概念 4.2 模型形式 4.3 各层的作用 5. TCP/IP五层&#xff08;或四层&#xff09…

书评 | 《深入理解高并发编程:JDK核心技术》

书评 | 《深入理解高并发编程&#xff1a;JDK核心技术》 作者简介 冰河&#xff1a;互联网资深技术专家、数据库技术专家、分布式与微服务架构专家&#xff1b;多年来一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技术的研究&#xff0c;在高并发、高可…

MySQL高级篇——关联查询和子查询优化

导航&#xff1a; 【黑马Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1. 关联查询优化 1.0 优化方案 1.1 数据准备 1.2 左外连接&#xff1a;优先右表创建索引&#xff0c;连接字段类型要一致…