> 개발 도구 > 자식 > 본문

Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다.

DDD
풀어 주다: 2023-09-11 11:50:36
원래의
1087명이 탐색했습니다.

모노레포란 무엇인가요?

모노레포 는 여러 관련 서비스, 프로젝트 및 구성 요소가 포함된 단일 저장소로, 여러 팀에서 관련되거나 관련되지 않은 프로젝트의 코드를 저장하는 데 사용할 수 있습니다. 모노레포(monorepo)라는 단어는 단일을 의미하는 모노(mono)와 저장소(repository)의 약어인 레포(repo)에서 파생되었습니다. Monorepo의 이점

monorepo 사용의 주요 이점은 다음과 같습니다.

  • 코드 공유: 프로젝트는 표준 코드, 라이브러리 또는 유틸리티를 공유합니다.
  • 재사용성: 구성요소는 다른 프로젝트에서 재사용되어야 합니다.
  • 더 쉬워진 코드 검토: 검토자가 관련 프로젝트 간의 변경 내용을 쉽게 확인할 수 있어 코드 품질이 향상되고 잠재적인 문제를 조기에 식별할 수 있으므로 코드 검토는 모노레포에서 더 효율적입니다.
  • 간소화된 CI/CD 프로세스: 단일 저장소를 사용하여 여러 프로젝트를 동시에 게시하는 것이 더욱 쉬워졌습니다.
  • 일관적인 종속성 관리: 프로젝트는 유사하거나 중복되는 종속성을 공유하며 종속성을 중앙에서 관리하려고 합니다.
  • 팀 협업: 관련 프로젝트를 진행하는 팀은 단일 저장소에서 지식, 통찰력 및 리소스를 공유하면서 더욱 효과적으로 협업할 수 있습니다.
  • 마이크로서비스 아키텍처: 밀접하게 관련된 일련의 마이크로서비스를 처리할 때 단일 리포지토리는 코드 공유, 종속성 관리 및 서비스 전반의 테스트를 단순화할 수 있습니다.
  • 버전 일관성: 모든 프로젝트는 표준 버전 제어 아키텍처를 공유하여 의사소통과 이해를 단순화할 수 있습니다.

Node.js를 사용하여 Monorepos를 관리하기 위해 특별히 설계된 라이브러리 및 도구

  • Lerna: 여러 패키지로 JavaScript 프로젝트를 관리하는 데 널리 사용되는 도구입니다.
  • Nx: Angular에 중점을 두지만 다른 프레임워크에도 적용 가능한 Nx는 효율적인 워크플로, 코드 재사용 및 테스트에 중점을 두고 단일 저장소를 위한 강력한 개발 도구를 제공합니다.
  • Yarn Workspace: Yarn에 내장된 monorepo 기능을 사용하면 단일 저장소에서 여러 패키지를 관리할 수 있습니다.
  • Rush: 대규모 코드 기반을 위해 Microsoft에서 개발한 확장 가능한 모노레포 관리자입니다.
  • Bolt: 일부 작업에 대해 Lerna보다 더 빠를 수 있는 성능에 초점을 맞춘 단일 저장소 관리 도구입니다.
  • Monorepo Manager: 이 도구는 모노레포의 생성 및 유지 관리를 단순화하고 패키지, 종속성 및 스크립트를 관리하기 위한 사용자 친화적인 인터페이스를 제공합니다.
  • pnpm: Yarn과 마찬가지로 pnpm도 작업 공간 기능을 통해 모노레포 설정을 지원하여 중복을 줄이고 공유 종속성을 통해 디스크 공간 활용도를 향상시킵니다.

각 도구는 특정한 이점과 기능을 제공하므로 선택은 프로젝트의 요구 사항과 선호도에 따라 달라집니다.

Lerna인가요?

Lerna는 여러 npm 패키지가 포함된 저장소를 관리하기 위해 설계된 도구입니다. 단일 git 저장소의 여러 패키지 저장소에 걸쳐 종속성 처리, 패키지 게시 및 릴리스 프로세스를 단순화합니다. Lerna는 동일한 저장소에서 서로 다른 npm 패키지를 작업하는 개발자 간의 효율적인 코드 공유 및 협업을 가능하게 하므로 단일 저장소에 특히 유용합니다. 이를 통해 개발자는 여러 패키지가 포함된 프로젝트를 단일 엔터티로 처리하여 개발 수명 주기 관리를 개선할 수 있습니다.

Lerna

  • Git: Git
  • Git Bash(터미널) 다운로드 및 설치 : Windows를 사용하는 경우 Git Bash가 Git 설치에 포함되어 있습니다. For 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
로그인 후 복사

Above npxnpx命令将创建一个新的 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 이 명령은 새로운 Lerna 관리 저장소를 생성합니다.


lerna.json🎜: 구성 파일에는 버전 제어 모드, 패키지 위치 등과 같은 Lerna 동작에 대한 설정이 포함되어 있습니다. 🎜🎜🎜 🎜: 전체 저장소에 대한 루트 package.json 파일입니다. 🎜🎜<p style="text-align:center"><img src="https://img.php.cn/upload/image/495/551/637/1694397153311761.png" title="1694397153311761.png" alt="Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다."/>🎜<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">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜<strong style="box-sizing: border-box;">2단계: 백엔드 패키지 생성</strong>🎜🎜🎜현재 루트 폴더에 있는지 확인하세요. 프로젝트 중간. 🎜🎜🎜🎜패키지 생성을 위한 Lerna 명령: 🎜<code style="box-sizing: border-box; 글꼴-가족: Menlo, Monaco, Consolas, "Courier New", monospace; 글꼴 크기: 17.1px; 패딩: 2px 4px; 색상: rgb(199, 37, 78); 배경색: rgb(249, 242, 244); 테두리 반경: 4px;">npx lerna create #{packageName} #{directory}</ code> 🎜🎜🎜여기서 디렉터리는 기본값입니다: 🎜<code style="box-sizing: border-box; 글꼴-가족: Menlo, Monaco, Consolas, "Courier New", monospace; 글꼴 크기: 17.1px; 패딩 : 2px 4px; 색상: rgb(199, 37, 78); 배경색: rgb(249, 242, 244); 테두리 반경: 4px;">패키지🎜
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.jsonpackage.json文件中,您还必须告知 Lerna 目录中的包services/编辑package.json工作区配置并添加"services/*"到其中。配置应类似于以下内容:

在根级别的主package.json文件中,您必须告知 Lerna services/ 目录中的软件包。修改工作区配置package.json并包含"services/*" 파일을 사용하려면 Lerna에게 디렉토리에 있는 패키지도 알려주어야 합니다. services/. Edit

package.json

작업 공간 구성 및 추가"services/*" Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다.구성은 다음과 같아야 합니다.

🎜🎜루트 수준의 마스터 🎜package.json</code >🎜🎜 파일을 삭제하려면 Lerna에게 services/ 디렉토리에 있는 패키지에 대해 알려주어야 합니다. 🎜🎜작업 공간 구성 수정🎜🎜<code style="box-sizing: border-box; 글꼴-가족: Menlo, Monaco, Consolas, "Courier New", monospace; 글꼴 크기: 17.1px; 패딩: 2px 4px; 색상 : rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">package.json🎜포함 🎜"services/*"🎜🎜. 🎜🎜구성은 다음과 같습니다: 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜
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(&#39;bunyan&#39;);
const logger = bunyan.createLogger({
  name: &#39;my-logging-service&#39;,
  level: &#39;info&#39;,
});
module.exports = logger;
로그인 후 복사
  • 日志记录测试用例(测试记录器):
  • 替换测试文件的内容services/logging/__tests__/logging.test.js

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

Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다.

  • 是时候使用 lerna 运行测试了npx lerna 실행 테스트 --scope="logging"

Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다.npx lerna run test --scope="logging"

Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다.

  • 日志服务实现现已就位,让我们开发支付服务。

第5步:设置支付服务

付款服务具有一个名为 的函数makePayment,它接受单个参数作为金额并利用记录器服务来记录活动。

services/payment

日志服务实现现已就位,让我们开发支付服务。🎜

第5步:设置支付服务

🎜付款服务具有一个name为 的函数🎜makePayment🎜 ,它接受单个参数 作为金额并利用记录器服务来记录活动。🎜🎜

🎜재🎜서비스/결제🎜目录内 ,并通过简单的功能设置支付服务。🎜🎜

  • 将现有脚本替换为 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(&#39;logging&#39;);
const paymentService = {
  makePayment: (amount) => {
    loggingService.info(&#39;Payment processing initiated&#39;);
    // Implement payment logic here
    loggingService.info(&#39;Payment processed successfully&#39;);
    return `Payment of ${amount} processed successfully`;
  },
};
module.exports = paymentService;
로그인 후 복사
  • makePayment支付服务功能测试用例。
  • 替换测试文件的内容services/payment/__tests__/payment.test.js

const chai = require(&#39;chai&#39;);
const paymentService = require(&#39;../lib/payment&#39;); // Import the payment service
const expect = chai.expect;
describe(&#39;Payment Service&#39;, () => {
  it(&#39;should make a payment successfully&#39;, () => {
    const paymentResult = paymentService.makePayment(100);
    expect(paymentResult).to.equal(&#39;Payment of 100 processed successfully&#39;);
  });
});
로그인 후 복사
  • 是时候使用 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(&#39;express&#39;);
const loggingService = require(&#39;logging&#39;);
const paymentService = require(&#39;payment&#39;);
const app = express();
app.get(&#39;/&#39;, (req, res) => {
  // Use of logging service
  loggingService.info(&#39;Backend server received a request&#39;);
  
  // Use the payment service
  const paymentResult = paymentService.makePayment(100);
  loggingService.info(&#39;Payment result:&#39;, paymentResult);
  res.send(&#39;Backend Server: Running!&#39;);
});
app.listen(3000, () => {
  console.log(&#39;Backend server is running on port 3000&#39;);
});
로그인 후 복사
  • 安装chai-http以对目录上的 API 进行单元测试packages/back-end
    • npm i chai-http --save-dev
  • 替换测试文件的内容,我们将在其中测试 API 是否按预期工作。

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

第 7 步:运行应用程序

  • 伟大的!现在,让我们启动服务器并观察所有服务如何组合在一起并工作。
  • lerna run start在根文件夹中执行。这将在端口 3000 上启动服务器。打开浏览器并导航至localhost:3000/您将观察到输出“后端服务器:正在运行!” 显示在浏览器中。
  • 检查终端中的日志,您将遇到类似于图中所示的Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다.。

检查终端中的日志,您将遇到类似于图中所示的Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다.。

  • Executelerna 실행 테스트lerna run test,这将运行所有微服务中的所有测试,因为所有微服务test, 이는 모든 마이크로서비스에서 모든 테스트를 실행합니다 test스크립트에 명령어가 있습니다.

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

결론

백엔드 서버, 결제 서비스, 로깅 서비스로 모노레포를 생성하면 통합 개발 접근 방식의 이점이 강조됩니다. 이 설정은 관련 구성 요소를 단일 저장소로 통합하여 효율적인 코드 관리 및 공유를 촉진합니다.

로깅 서비스를 결제 서비스 및 백엔드 서버에 통합하면 서비스 전반에 걸쳐 코드 재사용성과 일관된 로깅 방식의 힘이 입증됩니다.

모노레포 아키텍처를 채택하면 체계적이고 협력적인 개발 환경이 조성됩니다. 모듈화로 개발이 단순화되고 효율성이 향상되며 장기적인 유지 관리가 가능해집니다. 투명한 통신, 코드 재사용성 및 효과적인 테스트를 통해 복잡한 애플리케이션을 위한 견고한 기반을 제공합니다.

🎜

위 내용은 Lerna와 함께 플레이하면 Monorepo를 쉽게 구축할 수 있습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿