首頁 >開發工具 >Git >玩Lerna,幫助你輕鬆搭建Monorepo

玩Lerna,幫助你輕鬆搭建Monorepo

DDD
DDD原創
2023-09-11 10:13:021124瀏覽

什麼是 Monorepo?

monorepo是具有多個相關服務、專案和元件的單一儲存庫,不同的團隊可以使用來儲存相關或不相關項目的程式碼。 monorepo 一詞源自 mono,意思是單個,而 repo 是儲存庫的縮寫。

Monorepo 的好處

以下是使用monorepo 的一些主要好處:

  • 程式碼共享:  專案共享標準程式碼、函式庫或實用程式。
  • 可重複使用性:元件需要在不同的專案中重複使用。
  • 更輕鬆的程式碼審查:程式碼審查在monorepo 中更加高效,因為審查者可以輕鬆查看相關專案之間的更改上下文,這可以提高程式碼品質並更早發現潛在問題。 
  • 簡化 CI/CD 流程:使用單一儲存庫同時發佈多個專案變得更加簡單。
  • 一致的依賴關係管理:專案共享相似或重疊的依賴關係,並且您希望集中管理依賴關係。
  • 團隊協作:從事相關專案的團隊可以在單一儲存庫中更有效地協作,共享知識、見解和資源。
  • 微服務架構: 在處理一組密切相關的微服務時,單一儲存庫可以簡化跨服務的程式碼共享、相依性管理和測試。
  • 版本一致性: 所有專案都可以共享標準版本控制架構,從而簡化溝通與理解。

專門設計用於使用Node.js 管理Monorepos 的函式庫和工具

  • Lerna:廣泛使用的工具,用於管理具有多個套件的JavaScript 專案。
  • Nx:Nx 專注於 Angular 但適用於其他框架,為 monorepos 提供強大的開發工具,強調高效的工作流程、程式碼重複使用和測試。
  • Yarn 工作區:Yarn 的內建 monorepo 功能允許在單一程式碼庫中管理多個套件。
  • Rush:微軟開發的可擴展的 monorepo 管理器,適用於大型程式碼庫。
  • Bolt:單一儲存庫管理工具,專注於效能,對於某些操作可以比 Lerna 更快。
  • Monorepo Manager:該工具簡化了 monorepo 的建立和維護,提供了一個使用者友好的介面來管理套件、依賴項和腳本。
  • pnpm:與 Yarn 一樣,pnpm 也透過其工作區功能支援 monorepo 設置,透過共享依賴項減少重複並提高磁碟空間利用率。

每個工具都提供特定的優點和功能,因此選擇取決於您的專案的要求和偏好。

為什麼是Lerna

Lerna是一個設計用於管理包含多個 npm 套件的儲存庫的工具。 它簡化了在單一git儲存庫中的多包儲存庫中處理依賴項、發布和發布包的過程Lerna 對於 monorepo 特別有用,因為它可以在同一儲存庫中處理不同 npm 套件的開發人員之間實現高效的程式碼共享和協作。 它允許開發人員將具有多個套件的專案視為單一實體,從而改善開發生命週期管理。

#

安裝Lerna 之前的先決條件

  • #Git:下載並安裝Git
  • Git Bash(終端機):如果您使用的是Windows,Git Bash 包含在Git 安裝中;對於macOS 和Linux,請使用系統的終端。
  • Node.js:下載並安裝Node.js
  • npm#:npm 包含在Node.js 中,因此一旦安裝了Node.js,npm 就可以在您的終端機中使用。 透過開啟終端機並輸入進行驗證。 npm -v

我們正在建立一個單一儲存庫,其中包括後端伺服器使用的支付服務。 此外,後端伺服器和支付服務將共用日誌服務。

  • 日誌服務: 專為跨各種服務進行高效率日誌記錄而設計。
  • 支付服務: 負責處理付款相關功能。
  • 後端伺服器: 執行付款處理並整合日誌服務以實現無縫操作。

玩Lerna,幫助你輕鬆搭建Monorepo

現在讓我們深入研究使用 Lerna 實作 Monorepo。

第1步:建立目錄並初始化Lerna

導航到專案的根目錄並初始化Lerna:

mkdir monorepo # create a repo directory of the monorepo 
cd monorepo
npx lerna@latest init # initalize the repo

#上面的npx指令將會建立一個新的Lerna 管理的儲存庫。
lerna.json:設定檔包含Lerna行為的設置,例如版本控制模式、套件位置等

package.json :整個儲存庫的根package.json 檔案。

玩Lerna,幫助你輕鬆搭建Monorepo

git config user.name ${username}
git config user.email ${email}

第2步:產生後端套件

確保您位於專案的根資料夾中。

用於建立套件的Lerna 指令:npx lerna create #{packageName} #{directory}

這裡,目錄是預設的:packages

npx lerna create back-end 
//or
//this will skip the questionnaire related to package
npx lerna create back-end -y

上面的命令,不带-y  会提示你各种问题,比如覆盖包名、添加描述等等。但是,这些详细信息对于本示例来说并不重要,因此请按“Enter”键。

运行后,包后端将如下所示:

玩Lerna,幫助你輕鬆搭建Monorepo

步骤3:生成支付和日志服务包

再次执行相同的过程,但指定要创建的服务的目录,因为我们希望包位于该"services/"目录中。

在根package.json檔案中,您也必須告知Lerna 目錄中的套件services/#。 編輯package.json工作區配置並新增"services/*"到其中。 配置應類似下列內容:

在根層級的主package.json在根層級的主package.json檔案中,您必須告知Lerna services/ 目錄中的軟體包。 修改工作區設定package.json並包含"services/*"

設定應如下圖所示:玩Lerna,幫助你輕鬆搭建Monorepo

###############
npx lerna create payment services -y
npx lerna create logging services -y

第 4 步:设置日志服务

在该目录中,通过简单的配置使用 Bunyan 库services/logging设置日志记录服务。

  • 在日志服务中安装 Buyan 库,并将 Mocha 作为开发依赖项安装在根目录中,以测试所有服务。

// root folder install test dependencies
npm install mocha --save-dev 
//inside logging
cd services/logging
npm install bunyan
  • 替换日志功能文件的内容services/logging/lib/logging.js

const bunyan = require('bunyan');
const logger = bunyan.createLogger({
  name: 'my-logging-service',
  level: 'info',
});
module.exports = logger;
  • 日志记录测试用例(测试记录器):
  • 替换测试文件的内容services/logging/__tests__/logging.test.js

const loggingService = require('../lib/logging'); // Import the logging service
describe('Logging Service', () => {
  it('should log messages', () => {
    loggingService.info('Test log message');
  });
});
  • 更新 services/logging 的 package.json 中的测试脚本。
"test": "mocha ./__tests__/logging.test.js"
  • package.json 应如所附图像所示。

玩Lerna,幫助你輕鬆搭建Monorepo

  • 是時候使用lerna 運行測試了npx lerna run test --scope="logging"

玩Lerna,幫助你輕鬆搭建Monorepo

  • 日誌服務實作現已就位,讓我們開發支付服務。

第5步:設定支付服務

#付款服務具有一個名為的函數makePayment,它接受單一參數作為金額並利用記錄器服務來記錄活動。

services/payment目錄內,並透過簡單的功能設定支付服務。

  • 将现有脚本替换为 mocha,提供用于测试目的的代码片段。
  • 要在支付服务中使用日志记录服务,请将其依赖项添加到支付服务的 package.json 中,如下所述。然后,npm iservices/payment目录中运行进行安装。
"scripts": {
    "test": "mocha ./__tests__/payment.test.js"
  },
  "dependencies": {
    "logging": "file:../logging"
  }
  • package.json应该如图片所示
    玩Lerna,幫助你輕鬆搭建Monorepo
  • 替换支付文件的内容。services/payment/lib/payment.js

const loggingService = require('logging');
const paymentService = {
  makePayment: (amount) => {
    loggingService.info('Payment processing initiated');
    // Implement payment logic here
    loggingService.info('Payment processed successfully');
    return `Payment of ${amount} processed successfully`;
  },
};
module.exports = paymentService;
  • makePayment支付服务功能测试用例。
  • 替换测试文件的内容services/payment/__tests__/payment.test.js

const chai = require('chai');
const paymentService = require('../lib/payment'); // Import the payment service
const expect = chai.expect;
describe('Payment Service', () => {
  it('should make a payment successfully', () => {
    const paymentResult = paymentService.makePayment(100);
    expect(paymentResult).to.equal('Payment of 100 processed successfully');
  });
});
  • 是时候使用 lerna 运行测试了npx lerna run test --scope="payment"使用 lerna 运行测试
  • 我们已经完成了支付服务的实施。现在,让我们继续创建后端服务。

第 6 步:设置后端服务器

我们将使用基本的 GET API 配置服务器,该 API 利用记录器和支付服务。此设置将有助于付款和记录相应的活动。

  • 安装 Express 服务器并实现使用这两种服务的功能。
//from root
cd packages/back-end
npm install express
  • 替换日志功能文件的内容packages/back-end/lib/back-end.js
  • 我们想在服务器中使用支付和日志服务,所以让我们在package.jsonof的依赖项中添加以下代码片段packages/back-end 
"logging": "file:../services/logging",
"payment": "file:../services/payment"
  • 替换脚本块来运行服务器并进行测试,如下所示:
"scripts": {
    "start": "node ./lib/back-end.js",
    "test": "mocha ./__tests__/back-end.test.js --exit"
}
  • package.json应该如所附图片所示

玩Lerna,幫助你輕鬆搭建Monorepo

  • 现在,通过执行更新依赖项npm update
  • 将 的内容替换packages/back-end/lib/back-end.js为以下代码:
    • 我们将创建一个带有get / API端口的服务器3000,并使用日志记录和支付服务。 

const express = require('express');
const loggingService = require('logging');
const paymentService = require('payment');
const app = express();
app.get('/', (req, res) => {
  // Use of logging service
  loggingService.info('Backend server received a request');
  
  // Use the payment service
  const paymentResult = paymentService.makePayment(100);
  loggingService.info('Payment result:', paymentResult);
  res.send('Backend Server: Running!');
});
app.listen(3000, () => {
  console.log('Backend server is running on port 3000');
});
  • 安装chai-http以对目录上的 API 进行单元测试packages/back-end
    •  npm i chai-http --save-dev 
  • 替换测试文件的内容,我们将在其中测试 API 是否按预期工作。

const chai = require('chai');
const chaiHttp = require('chai-http');
const app = require('../lib/back-end'); // Import the Express app
// using request server as chaiHttp;
chai.use(chaiHttp);
const expect = chai.expect;
describe('Backend Server', () => {
  it('should log a request and process payment', (done) => {
    chai.request(app)
      .get('/')
      .end((err, res) => {
        expect(res).to.have.status(200);
        expect(res.text).to.equal('Backend Server: Running!');
        done();
      });
  });
});
  • 恭喜!这样就完成了 monorepo 中三个微服务的简洁有效的实现。 

第 7 步:运行应用程序

  • 伟大的!现在,让我们启动服务器并观察所有服务如何组合在一起并工作。
  • lerna run start在根文件夹中执行。这将在端口 3000 上启动服务器。打开浏览器并导航至localhost:3000/您将观察到输出“后端服务器:正在运行!” 显示在浏览器中。
  • 检查终端中的日志,您将遇到类似于图中所示的玩Lerna,幫助你輕鬆搭建Monorepo。

检查终端中的日志,您将遇到类似于图中所示的玩Lerna,幫助你輕鬆搭建Monorepo。

  • 執行lerna run test,這將運行所有微服務中的所有測試,因為所有微服務test在腳本中都有指令。

执行 lerna run test,这将运行所有微服务中的所有测试,因为所有微服务的脚本中都有 test 命令。

#結論

#建立具有後端伺服器、付款服務和日誌記錄服務的monorepo 凸顯了統一開發方法的好處。 此設定透過將相關元件整合到單一儲存庫中來促進高效的程式碼管理和共用。

將日誌記錄服務整合到支付服務和後端伺服器中體現了程式碼可重複使用性和跨服務的一致日誌記錄實踐的強大功能。

採用 monorepo 架構會帶來一個有組織且協作的開發環境。 模組化簡化了開發,提高了效率和長期維護。 它為複雜的應用程式提供了堅實的基礎,具有透明的通訊、程式碼可重複使用性和有效的測試。

#

以上是玩Lerna,幫助你輕鬆搭建Monorepo的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn