Monorepo ialah repositori tunggal dengan pelbagai perkhidmatan, projek dan komponen yang berkaitan, yang boleh digunakan oleh pasukan yang berbeza untuk menyimpan kod bagi projek yang berkaitan atau tidak berkaitan. Perkataan monorepo berasal daripada mono, yang bermaksud tunggal, dan repo, yang merupakan singkatan dari repositori. Manfaat Monorepo
Setiap alat menawarkan faedah dan ciri khusus, jadi pilihan bergantung pada keperluan dan keutamaan projek anda.
Lerna ialah alat yang direka untuk mengurus repositori yang mengandungi berbilang pakej npm. Ia memudahkan proses pengendalian kebergantungan, penerbitan dan pelepasan pakej merentasi berbilang repositori pakej dalam satu git repositori. Lerna amat berguna untuk monorepo kerana ia membolehkan perkongsian kod dan kerjasama yang cekap antara pembangun yang bekerja pada pakej npm yang berbeza dalam repositori yang sama. Ia membolehkan pembangun merawat projek dengan berbilang pakej sebagai satu entiti, meningkatkan pengurusan kitaran hayat pembangunan.
npm -v
.
Kami sedang mencipta satu repositori yang merangkumi perkhidmatan pembayaran yang digunakan oleh pelayan bahagian belakang. Selain itu, pelayan bahagian belakang dan perkhidmatan pembayaran akan berkongsi perkhidmatan log.
Sekarang mari kita mendalami pelaksanaan Monorepo menggunakan Lerna.
Navigasi ke direktori akar projek anda dan mulakan Lerna:
mkdir monorepo # create a repo directory of the monorepo cd monorepo npx lerna@latest init # initalize the repo
Atas npx
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
Arahan akan mencipta repositori yang diuruskan Lerna baharu.
🎜: Fail root package.json untuk keseluruhan repositori. 🎜🎜<p style="text-align:center"><img src="https://img.php.cn/upload/image/495/551/637/1694397153311761.png" title="1694397153311761.png" alt="Bermain dengan Lerna untuk membantu anda membina Monorepo dengan mudah"/>🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">npx lerna create back-end
//or
//this will skip the questionnaire related to package
npx lerna create back-end -y</pre><div class="contentsignin">Salin selepas log masuk</div></div><div class="contentsignin">Salin selepas log masuk</div></div>🎜<strong style="box-sizing: border-box;">Langkah 2: Jana pakej hujung belakang</strong>🎜🎜🎜Pastikan anda berada dalam folder akar anda tengah projek. 🎜🎜🎜🎜Arahan Lerna untuk mencipta pakej: 🎜<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 17.1px; padding: 2px 4px; warna: rgb(199, 37, 78); 🎜🎜🎜Di sini, direktori ialah lalai: 🎜<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 17.1px; padding : 2px 4px; warna: rgb(199, 37, 78);<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">npx lerna create back-end
//or
//this will skip the questionnaire related to package
npx lerna create back-end -y</pre><div class="contentsignin">Salin selepas log masuk</div></div><div class="contentsignin">Salin selepas log masuk</div></div><p><span style="box-sizing: border-box; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; text-wrap: wrap; background-color: rgb(255, 255, 255); vertical-align: inherit;"><span style="box-sizing: border-box; vertical-align: inherit;">上面的命令,不带</span></span><code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 17.1px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px; text-wrap: wrap;">-y
会提示你各种问题,比如覆盖包名、添加描述等等。但是,这些详细信息对于本示例来说并不重要,因此请按“Enter”键。运行后,包后端将如下所示:
再次执行相同的过程,但指定要创建的服务的目录,因为我们希望包位于该"services/"
目录中。
At the rootpackage.json
文件中,您还必须告知 Lerna 目录中的包services/
。编辑package.json
工作区配置并添加"services/*"
到其中。配置应类似于以下内容:
在根级别的主package.json
文件中,您必须告知 Lerna services/ 目录中的软件包。修改工作区配置package.json
并包含"services/*"
<span style="box-sizing: border-box; vertical-align: inherit;">Edit</span><span style="box-sizing: border-box; vertical-align: inherit;"><code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 17.1px; padding: 2px 4px; color: rgb (199, 37, 78); latar belakang-warna: rgb(249, 242, 244); : border-box; font-family: Menlo, Monaco, Consolas, "Courier New", saiz fon: 17.1px; (249, 242, 244); jejari sempadan: 4px;">"perkhidmatan/*"
ke dalamnya.
Konfigurasi hendaklah kelihatan seperti berikut: Kuasa pada peringkat akar 在该目录中,通过简单的配置使用 Bunyan 库 在日志服务中安装 Buyan 库,并将 Mocha 作为开发依赖项安装在根目录中,以测试所有服务。 替换日志功能文件的内容 付款服务具有一个名为 的函数 在 🎜付款服务具有一个名为 的函数🎜 我们将使用基本的 GET API 配置服务器,该 API 利用记录器和支付服务。此设置将有助于付款和记录相应的活动。
Mencipta monorepo dengan pelayan bahagian belakang, perkhidmatan pembayaran dan perkhidmatan pembalakan menyerlahkan faedah pendekatan pembangunan bersatu. Persediaan ini menggalakkan pengurusan dan perkongsian kod yang cekap dengan menyatukan komponen yang berkaitan ke dalam satu repositori.
Mengguna pakai seni bina monorepo akan membawa persekitaran pembangunan yang teratur dan kolaboratif. Modularisasi memudahkan pembangunan, meningkatkan kecekapan dan penyelenggaraan jangka panjang. Ia menyediakan asas yang kukuh untuk aplikasi yang kompleks dengan komunikasi yang telus, kebolehgunaan semula kod dan ujian yang berkesan. Atas ialah kandungan terperinci Bermain dengan Lerna untuk membantu anda membina Monorepo dengan mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!</span></p> fail, anda mesti memberitahu Lerna tentang pakej dalam perkhidmatan/ direktori. 🎜🎜Ubah suai konfigurasi ruang kerja🎜🎜<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 17.1px; padding: 2px 4px; color : rgb(199, 37, 78); latar belakang-warna: rgb(249, 242, 244); : border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; padding: 2px 4px; (249, 242, 244); jejari sempadan: 4px;">"perkhidmatan/*"
🎜🎜. Konfigurasi sepatutnya kelihatan seperti ini: 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜npx lerna create payment services -y
npx lerna create logging services -y
第 4 步:设置日志服务
services/logging
设置日志记录服务。// 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"
</ul><p style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; text-wrap: wrap; " data-sizeformatted="145.5 kB" data-mimetype="image/png" data-creationdate="1693686255407" data-creationdateformatted="09/02/2023 08:24 PM" data-type="temp" url data ="https://img.php.cn/upload/article/001/246/273/169439838798033.png" data-modificationdate="null" data-size="145485" data-name="screenshot-2023-09 -02-at-42350-pm.png" data-id="17178979" data-src="https://img.php.cn/upload/article/001/246/273/169439838798033.png" class=" fr-fic fr-dib ls-is-cached lazyloaded" alt="Bermain dengan Lerna untuk membantu anda membina Monorepo dengan mudah" src="https://img.php.cn/upload/article/001/246/273/169439838798033.png" style="box -saiz: kotak sempadan; sempadan: 0px; vertical-align: tengah; lebar maksimum: 100%; ketinggian: auto; text-align: tengah; margin: auto; paparan: blok; terapung: tiada !penting; lebar: 500px;"/><code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 17.1px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">npx lerna run test --scope="logging"
第5步:设置支付服务
makePayment
,它接受单个参数作为金额并利用记录器服务来记录活动。services/payment
第5步:设置支付服务
makePayment
🎜,它接受单个参数作为金额并利用记录器服务来记录活数作为金额并利用记录器服务来记录活动。🎀box="style-boxing" jidar atas: 5px; jidar bawah: 15px; padding-top: 0px; warna: rgb(34, 38, 53); font-family: Cambria, serif; saiz fon: 19px; text-wrap: bungkus; background-color: rgb(255, 255, 255);">🎜在🎜perkhidmatan/pembayaran
🎜目录内,并通过简单的功能设置支付服务。🎜🎜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"
第 6 步:设置后端服务器
//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();
});
});
});
第 7 步:运行应用程序
lerna run start
在根文件夹中执行。这将在端口 3000 上启动服务器。打开浏览器并导航至localhost:3000/
。您将观察到输出“后端服务器:正在运行!” 显示在浏览器中。
Kesimpulanlerna run test
,这将运行所有微服务中的所有测试,因为所有微服务test