프로젝트 코드 구성: Polyrepo와 Monorepo
프로젝트 코드를 구성하는 두 가지 주요 방법은 다음과 같습니다.
Monorepo는 Yandex와 같은 많은 대규모 기술 회사에서 사용됩니다. Monorepo는 팀과 사업부 간에 아이디어와 모범 사례를 공유하는 데 도움이 됩니다. Monorepo 및 관련 도구에 대한 자세한 내용을 보려면 https://www.php.cn/link/b01ccf4f29b57b0b1bdb9407050db28d를 방문하세요. 이 기사에서는 PNPM을 사용하여 Monorepo를 구축하는 간단한 솔루션에 중점을 둘 것입니다.
PNPM은 작업 공간을 사용하여 여러 프로젝트를 단일 저장소에 통합합니다.
환경설정
먼저 빈 폴더를 새 Monorepo 프로젝트로 만듭니다. 창고에서 PNPM 초기화:
<code class="language-bash">pnpm init</code>
그런 다음 패키지 폴더를 설명하는 pnpm-workspace.yaml
파일을 만듭니다.
<code class="language-yaml">// pnpm-workspace.yaml packages: - 'packages/**' - 'apps/**'</code>
/packages
폴더에는 공유 라이브러리가 있고 /apps
폴더에는 애플리케이션(예: 독립 실행형 React Native 모바일 애플리케이션 및 API 서버와 통신하기 위해 동일한 구성 요소 또는 연결 라이브러리를 사용하는 웹 애플리케이션)이 있습니다.
이 기사에서는 Telegram 게시 로봇을 예로 사용합니다. 해당 소스 코드는 GitHub에 있습니다: https://www.php.cn/link/8164ca2fe04767628ac1c6813e8a0867. 다운로드하여 /apps/publish-bot
폴더에 압축을 푼 후 설치 명령을 실행하세요.
<code class="language-bash">pnpm install</code>
텔레그램 툴킷 만들기
/packages
폴더에 telegram-utils
이라는 폴더를 만들고 PNPM 및 TypeScript를 초기화합니다.
<code class="language-bash">pnpm init && pnpm add -D typescript && pnpm tsc --init</code>
이 패키지는 모든 메시지(텍스트, 비디오, 사진)의 텍스트와 캡션을 결합하는 기능을 제공합니다. Telegraf 패키지를 설치해야 합니다:
<code class="language-bash">pnpm add telegraf</code>
모든 소스코드는 /src
디렉토리에 위치해야 합니다. 기능 그룹화를 용이하게 하려면 다른 폴더를 생성하는 것이 좋습니다. 텍스트를 결합하는 기능은 /texts
폴더에 있으며 코드는 다음과 같습니다.
<code class="language-typescript">// packages/telegram-utils/src/texts/combineTexts.ts import { Message } from 'telegraf/types'; import { FmtString, join } from 'telegraf/format'; type GroupedMessages = { photos: Array<Message.PhotoMessage>; videos: Array<Message.VideoMessage>; text: Array<Message.TextMessage>; }; export const combineTexts = ({ photos, videos, text }: GroupedMessages) => { const photoTexts = photos .map(photo => photo.caption ? new FmtString(photo.caption, photo.caption_entities) : undefined) .filter((t): t is Required<FmtString> => t !== undefined); const videoTexts = videos .map(video => video.caption ? new FmtString(video.caption, video.caption_entities) : undefined) .filter((t): t is Required<FmtString> => t !== undefined); const allTexts = []; if (text.length) allTexts.push(join(text.map(t => new FmtString(t.text, t.entities))), '\n'); if (photoTexts.length) allTexts.push(join(photoTexts, '\n')); if (videoTexts.length) allTexts.push(join(videoTexts, '\n')); return join(allTexts, '\n'); };</code>
코드 설명:
undefined
이 반환되어야 합니다.
폴더에 대한 색인 파일 만들기: /texts
<code class="language-bash">pnpm init</code>
파일의 package.json
필드를 사용하여 패키지 기능 내보내기를 설정합니다. exports
<code class="language-yaml">// pnpm-workspace.yaml packages: - 'packages/**' - 'apps/**'</code>
를 추가하세요. @monorepo
파일에서 package.json
패키지 이름을 바꿉니다: telegram-utils
<code class="language-bash">pnpm install</code>
<code class="language-bash">pnpm init && pnpm add -D typescript && pnpm tsc --init</code>
파일: package.json
<code class="language-bash">pnpm add telegraf</code>
폴더를 /src
로 정의하고 패키지의 rootDir
을 outDir
로 정의합니다. 업데이트됨 /dist
: tsconfig.json
<code class="language-typescript">// packages/telegram-utils/src/texts/combineTexts.ts import { Message } from 'telegraf/types'; import { FmtString, join } from 'telegraf/format'; type GroupedMessages = { photos: Array<Message.PhotoMessage>; videos: Array<Message.VideoMessage>; text: Array<Message.TextMessage>; }; export const combineTexts = ({ photos, videos, text }: GroupedMessages) => { const photoTexts = photos .map(photo => photo.caption ? new FmtString(photo.caption, photo.caption_entities) : undefined) .filter((t): t is Required<FmtString> => t !== undefined); const videoTexts = videos .map(video => video.caption ? new FmtString(video.caption, video.caption_entities) : undefined) .filter((t): t is Required<FmtString> => t !== undefined); const allTexts = []; if (text.length) allTexts.push(join(text.map(t => new FmtString(t.text, t.entities))), '\n'); if (photoTexts.length) allTexts.push(join(photoTexts, '\n')); if (videoTexts.length) allTexts.push(join(videoTexts, '\n')); return join(allTexts, '\n'); };</code>
통합
으로 돌아가 /apps/publish-bot
패키지를 종속 항목에 추가하세요. 패키지 버전을 지정할 필요는 없으며 @monorepo/telegram-utils
를 사용하여 다음을 나타냅니다. workspace:*
<code class="language-typescript">// packages/telegram-utils/src/texts/index.ts export * from './combineTexts';</code>
<code class="language-json">// packages/telegram-utils/package.json "exports": { "./texts": { "import": "./src/texts/index.ts", "require": "./dist/texts/index.js" } }</code>
명령 업데이트: preview
<code class="language-json">// packages/telegram-utils/package.json "name": "@monorepo/telegram-utils"</code>
: /apps/publish-bot/tsconfig.json
<code class="language-json">// packages/telegram-utils/package.json "scripts": { "build": "tsc -p tsconfig.json" }</code>
<code class="language-json">// packages/telegram-utils/package.json { "name": "@monorepo/telegram-utils", "version": "1.0.0", "main": "index.js", "scripts": { "build": "tsc -p tsconfig.json" }, "keywords": [], "license": "ISC", "exports": { "./texts": { "import": "./src/texts/index.ts", "require": "./dist/texts/index.js" } }, "devDependencies": { "typescript": "^5.7.3" }, "dependencies": { "telegraf": "^4.16.3" } }</code>
요약
이제 릴리스 봇은 내부 공유 라이브러리/패키지를 사용하며 Monorepo에 있습니다. 이를 통해 새로운 기능을 빠르게 구축하고 여러 애플리케이션에서 코드를 재사용할 수 있습니다.Unsplash에서 Gabriel Heinzer를 통한 이미지
위 내용은 PNPM을 사용하여 Monorepo에서 프로젝트 빌드 및 실행의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!