monorepo是具有多個相關服務、專案和元件的單一儲存庫,不同的團隊可以使用它來儲存相關或不相關項目的程式碼。 monorepo 一詞源自 mono,意思是單個,而 repo 是儲存庫的縮寫。
以下是使用monorepo 的一些主要好處:
每個工具都提供特定的優點和功能,因此選擇取決於您的專案的要求和偏好。
Lerna是一個設計用於管理包含多個 npm 套件的儲存庫的工具。 它簡化了在單一git儲存庫中的多包儲存庫中處理依賴項、發布和發布包的過程。 Lerna 對於 monorepo 特別有用,因為它可以在同一儲存庫中處理不同 npm 套件的開發人員之間實現高效的程式碼共享和協作。 它允許開發人員將具有多個套件的專案視為單一實體,從而改善開發生命週期管理。
#npm -v
。
我們正在建立一個單一儲存庫,其中包括後端伺服器使用的支付服務。 此外,後端伺服器和支付服務將共用日誌服務。
現在讓我們深入研究使用 Lerna 實作 Monorepo。
導航到專案的根目錄並初始化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 檔案。
git config user.name ${username} git config user.email ${email}
確保您位於專案的根資料夾中。
用於建立套件的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”键。
运行后,包后端将如下所示:
再次执行相同的过程,但指定要创建的服务的目录,因为我们希望包位于该"services/"
目录中。
在根package.json
檔案中,您也必須告知Lerna 目錄中的套件services/
#。 編輯package.json
工作區配置並新增"services/*"
到其中。 配置應類似下列內容:
在根層級的主package.json
在根層級的主package.json檔案中,您必須告知Lerna services/ 目錄中的軟體包。
修改工作區設定package.json並包含"services/*"
設定應如下圖所示:
###############npx lerna create payment services -y npx lerna create logging services -y
在该目录中,通过简单的配置使用 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'); }); });
"test": "mocha ./__tests__/logging.test.js"
npx lerna run test --scope="logging"
#付款服務具有一個名為的函數makePayment
,它接受單一參數作為金額並利用記錄器服務來記錄活動。
在services/payment
目錄內,並透過簡單的功能設定支付服務。
npm i
在services/payment
目录中运行进行安装。
"scripts": { "test": "mocha ./__tests__/payment.test.js" }, "dependencies": { "logging": "file:../logging" }
package.json
应该如图片所示
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'); }); });
npx lerna run test --scope="payment"
我们将使用基本的 GET API 配置服务器,该 API 利用记录器和支付服务。此设置将有助于付款和记录相应的活动。
//from root cd packages/back-end npm install express
packages/back-end/lib/back-end.js
package.json
of的依赖项中添加以下代码片段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
应该如所附图片所示
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
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(); }); }); });
lerna run start
在根文件夹中执行。这将在端口 3000 上启动服务器。打开浏览器并导航至localhost:3000/
。您将观察到输出“后端服务器:正在运行!” 显示在浏览器中。
lerna run test
,這將運行所有微服務中的所有測試,因為所有微服務test
在腳本中都有指令。
#建立具有後端伺服器、付款服務和日誌記錄服務的monorepo 凸顯了統一開發方法的好處。 此設定透過將相關元件整合到單一儲存庫中來促進高效的程式碼管理和共用。
將日誌記錄服務整合到支付服務和後端伺服器中體現了程式碼可重複使用性和跨服務的一致日誌記錄實踐的強大功能。
採用 monorepo 架構會帶來一個有組織且協作的開發環境。 模組化簡化了開發,提高了效率和長期維護。 它為複雜的應用程式提供了堅實的基礎,具有透明的通訊、程式碼可重複使用性和有效的測試。
#以上是玩Lerna,幫助你輕鬆搭建Monorepo的詳細內容。更多資訊請關注PHP中文網其他相關文章!