1分钟教你从0-1搭建Monorepo多包项目

Monorepo是将多个项目放在一个仓库中管理,促进代码共享和开发便利,但可能带来构建速度慢的问题。与之对比,Multirepo更强调项目独立。pnpm作为包管理器,节省磁盘空间,加快安装速度,尤其适合monorepo。文章提到了pnpm的工作区配置和常用命令,并提醒读者注意Monorepo的结构和依赖管理。

1、monorepo是啥

在了解Monorepo之前,先说一下Multirepo Multirepo:指定的是不同项目由不同的仓库来存放管理
每个仓库都维护着各项目的npm包依赖 Monorepo指的是包含多个项目的单个仓库。 各个项目可以单独运行、打包、发布

在这里插入图片描述
在这里插入图片描述

Multirepo:分散式管理
Monorepo:集中式管理

1.1 MultirepoMonorepo特点

Muitirepo
1、简单明朗
2、灵活
3、缺点:

  • 项目之间难以建立联系
  • 将模块打包为npm包,发布到npm上
  • 挂载到全局变量window
  • 直接copy一份代码

Monorepo

  • 良好的代码共享
  • 新建项目方便
  • 开发便利
  • 缺点
    • 巨石项目下载、
    • 编译慢;
    • 对项目打包构建难度较大

目前已有很多的开源项目使用monorepo,如:Vue、React、babel、Element ui等

1.2 管理工具

1.bazel
2.lerna(版本管理和发布)+yarn/npm
3.pnpm

1.3 pnpm简介

pnpm和npm、yarn一样,是一个包管理器
特点:

  • 节省磁盘空间 安装速度快 支持monorepo

pnpm内部使用了基于内容寻址的方式来存储包文件的,不会重复安装同一个包的依赖;
如果使用yarn/npm。如果多个项目都依赖同一个包,那这个包可能会被安装多次
pnpm安装的包,如果其他项目需要用到这个包,那么会使用硬链接去连接到这个包 消除依赖提升,创建非扁平化的node_modules
“幽灵依赖”放在了node_modules下的.pnpm

1.4 pnpm常用命令

// 安装依赖
pnpm i  /  pnpm install

// 单独安装
pnpm add xxx

// 删除依赖
pnpm remove xxx

// 运行项目
pnpm dev  / pnpm run dev

// 安装依赖到根目录
pnpm add xxx -w

// 安装依赖到packages中的包
pnpm add xxx -r

// 安装到某个包
pnpm add xxx --filter A

2、Monorepo结构

├─packages
|  ├─A
     ├─package.json
|  ├─B
     ├─package.json
|  ├─C
     ├─package.json
├─package.json
├─pnpm-workspace.yaml
├─README.md

2.1 pnpm-workspace.yaml

pnpm工作区包含/排除的目录
放在根目录下

packages:
  # all packages in direct subdirs of packages/
  - 'packages/*'
  
  # exclude packages that are inside test directories
  - '!**/A/**'

3 构建monorepo-demo

在这里插入图片描述

重要的事情说三遍:

## 1、不要在根目录package.json中的dependencies安装依赖,在各自的包里面安装,根目录主要是提供给工程配置用的! 

## 2、packages中包的依赖尽量保持一致`

以上就是简单的monorepo的搭建,后面会根据项目拓展增加需要注意的点!

<think> 嗯,用户这次明确要求提供Jenkins部署React Native从01的超详细步骤,看来是个需要实操指南的开发工程师。之前用户提到"在详细些",现在结合站内引用补充了React Native持续交付的关键技术栈(Git/Jenkins/Fastlane)和monorepo架构参考,说明用户需要的是企业级落地方案。 用户提供的三条引用很有价值:[1]号引用提到iOS/Android双平台自动化,[2]号给出RN特有的bundle命令,[3]号则暗示项目可能涉及复杂架构。需要将这些技术点融入部署流程,重点解决三个痛点:RN资源打、双平台差异处理、证书管理。 从技术深度看,用户应该具备基础运维知识(比如能搭建普通Android打环境),但可能需要RN特有的细节指导。特别要注意iOS部署比Android更复杂,需要分平台说明。考虑到用户要"超详细步骤",决定拆解为8个阶段,重点标注: - RN特有的react-native bundle预处理(区别于原生打- Android的assembleRelease与iOS的xcodebuild差异 - 用Fastlane简化应用商店上传(引用[1][2]提到的工具) - 环境配置管理(如引用[3]monorepo项目的.env方案) 安全方面需强调密钥存储方案,避免硬编码证书。在"证书与签名配置"环节加入Jenkins Credentials Binding操作,这在实际项目中极易出错。另外用户没提测试环节,但持续集成必须含自动化测试阶段,所以补充在阶段三。 最后生成的三个相关问题都指向工程化难点:热更新兼容性、分支构建策略、大仓库优化。特别是monorepo(引用[3])在RN项目中的构建加速技巧,这对大型项目很有价值——如果用户后续追问,需要准备TurboRepo缓存方案。 </think> 以下是基于React Native 0.72版本的Jenkins从零部署超详细流程,结合Fastlane实现双平台自动化,含核心技术细节和避坑点: --- ### 一、环境准备(Linux/macOS) 1. **基础依赖安装** ```bash # Node.js (LTS版本) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash nvm install 18 # JDK 11 (Android必需) sudo apt install openjdk-11-jdk # Watchman (RN文件监听) brew install watchman # macOS sudo apt install watchman # Ubuntu ``` 2. **Android环境配置** - 安装Android Studio后配置环境变量: ```bash export ANDROID_HOME=$HOME/Android/Sdk export PATH=$PATH:$ANDROID_HOME/platform-tools export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin ``` - 接受Licenses: ```bash yes | sdkmanager --licenses ``` 3. **iOS环境要求** - macOS系统 + Xcode ≥14.1 - 安装CocoaPods: ```bash sudo gem install cocoapods -v 1.12.0 ``` --- ### 二、Jenkins初始化 1. **Docker部署Jenkins** ```bash docker run -d -p 8080:8080 -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ jenkins/jenkins:lts-jdk11 ``` 2. **安装必要插件** ``` Git Parameter, NodeJS, Keychains and Provisioning Profiles (iOS), Fastlane ``` 3. **全局工具配置** - NodeJS 18.x - Android SDK路径:`$ANDROID_HOME` - Fastlane路径:`/usr/local/bin` --- ### 三、RN项目构建关键流程 #### Android专项配置 ```groovy stage('Android Build') { steps { script { // 生成RN Bundle(核心步骤!) sh """ react-native bundle --platform android --dev false \ --entry-file index.js \ --bundle-output android/app/src/main/assets/index.android.bundle \ --assets-dest android/app/src/main/res/ """ // 执行Gradle构建 dir('android') { sh "./gradlew clean assembleRelease -PMYAPP_RELEASE_STORE_FILE=${env.KEYSTORE_PATH}" } } } } ``` > **避坑提示**:资源文件生成路径必须与`android/app/build.gradle`中`sourceSets`配置一致[^2] #### iOS专项配置 ```groovy stage('iOS Build') { steps { script { sh "pod install --repo-update" # 安装iOS依赖 // Fastlane自动化(推荐) fastlane ios build_release } } } ``` > 需提前配置`fastlane/Fastfile`: ```ruby lane :build_release do increment_build_number(xcodeproj: "MyApp.xcodeproj") build_app( scheme: "MyApp", export_method: "app-store", output_directory: "./build" ) end ``` --- ### 四、签名与证书管理 | 平台 | 存储位置 | Jenkins配置方式 | |----------|-------------------------------|--------------------------------| | Android | JKS密钥文件 | Credentials Binding注入变量 | | iOS | Provisioning Profile + P12 | Keychains and Provisioning插件 | **Android密钥安全注入**: ```groovy withCredentials([file(credentialsId: 'android-keystore', variable: 'KEYSTORE')]) { sh 'cp $KEYSTORE android/app/my-release-key.keystore' } ``` --- ### 五、完整Jenkinsfile示例 ```groovy pipeline { agent any environment { NODE_VERSION = '18' } stages { stage('Checkout') { steps { git url: 'https://github.com/yourproject.git' } } stage('Install Deps') { steps { nodejs(configId: 'nodejs') { sh 'yarn install' } } } stage('Android Build') { steps { /* 见第三节Android代码 */ } } stage('iOS Build') { when { expression { return env.BUILD_IOS == 'true' } } steps { /* 见第三节iOS代码 */ } } stage('Deploy') { parallel { stage('Firebase Android') { steps { sh 'fastlane android firebase' } } stage('TestFlight') { steps { sh 'fastlane ios testflight' } } } } } } ``` --- ### 六、常见问题解决 1. **Bundle文件缺失导致白屏** - 确保构建前执行`react-native bundle` - 检查`assets`目录是否被`.gitignore`排除 2. **iOS证书签名失败** ```bash # 在Jenkins节点执行解锁钥匙串 security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${HOME}/Library/Keychains/login.keychain ``` 3. **资源冲突错误** ```bash # 清理Android旧资源 rm -rf android/app/src/main/res/drawable-* rm -rf android/app/src/main/res/raw ``` > 完整流程验证环境:React Native 0.72 + Jenkins 2.414 + Fastlane 2.213[^1][^2] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黒客与画家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值