Projektcode-Organisation: Polyrepo vs. Monorepo
Es gibt im Wesentlichen zwei Möglichkeiten, Projektcode zu organisieren:
Monorepo wird von vielen großen Technologieunternehmen wie Yandex verwendet. Monorepo hilft beim Austausch von Ideen und Best Practices zwischen Teams und Geschäftsbereichen. Weitere Informationen zu Monorepo und zugehörigen Tools finden Sie unter https://www.php.cn/link/b01ccf4f29b57b0b1bdb9407050db28d. Dieser Artikel konzentriert sich auf eine einfache Lösung zum Erstellen von Monorepo mit PNPM.
PNPM verwendet Arbeitsbereiche, um mehrere Projekte in einem einzigen Repository zu integrieren.
Umgebungseinrichtung
Erstellen Sie zunächst einen leeren Ordner als neues Monorepo-Projekt. PNPM im Lager initialisieren:
<code class="language-bash">pnpm init</code>
Erstellen Sie dann eine pnpm-workspace.yaml
-Datei, die den Paketordner beschreibt:
<code class="language-yaml">// pnpm-workspace.yaml packages: - 'packages/**' - 'apps/**'</code>
/packages
enthält gemeinsam genutzte Bibliotheken und der Ordner /apps
enthält Anwendungen (z. B. eine eigenständige React Native-Mobilanwendung und eine Webanwendung, die dieselbe Komponente oder Verbindungsbibliothek für die Kommunikation mit dem API-Server verwendet).
In diesem Artikel wird ein Telegram-Veröffentlichungsroboter als Beispiel verwendet. Der Quellcode befindet sich auf GitHub: https://www.php.cn/link/8164ca2fe04767628ac1c6813e8a0867. Laden Sie es herunter und extrahieren Sie es in den Ordner /apps/publish-bot
. Führen Sie dann den Installationsbefehl aus:
<code class="language-bash">pnpm install</code>
Telegram-Toolkit erstellen
Erstellen Sie einen Ordner mit dem Namen /packages
im Ordner telegram-utils
und initialisieren Sie PNPM und TypeScript:
<code class="language-bash">pnpm init && pnpm add -D typescript && pnpm tsc --init</code>
Dieses Paket bietet eine Funktion zum Kombinieren von Text und Bildunterschriften aller Nachrichten (Text, Video und Foto). Das Telegraf-Paket muss installiert sein:
<code class="language-bash">pnpm add telegraf</code>
Der gesamte Quellcode sollte sich im Verzeichnis /src
befinden. Um die funktionale Gruppierung zu erleichtern, empfiehlt es sich, unterschiedliche Ordner anzulegen. Die Funktion zum Kombinieren von Text befindet sich im Ordner /texts
, der Code lautet wie folgt:
<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>
Codebeschreibung:
undefined
zurückgegeben werden;
: /texts
<code class="language-bash">pnpm init</code>
in der Datei package.json
, um den Export der Paketfunktion einzurichten: exports
<code class="language-yaml">// pnpm-workspace.yaml packages: - 'packages/**' - 'apps/**'</code>
hinzu. Benennen Sie das Paket @monorepo
in der Datei package.json
um: telegram-utils
<code class="language-bash">pnpm install</code>
<code class="language-bash">pnpm init && pnpm add -D typescript && pnpm tsc --init</code>
Datei: package.json
<code class="language-bash">pnpm add telegraf</code>
als /src
und den Ordner rootDir
des Pakets als outDir
. Aktualisiert /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>
Integration
Gehen Sie zurück zu und fügen Sie das Paket /apps/publish-bot
zu den Abhängigkeiten hinzu. Beachten Sie, dass Sie die Paketversion nicht angeben müssen. Verwenden Sie @monorepo/telegram-utils
, um Folgendes anzugeben: 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>
zum Veröffentlichen von Bots: 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>
Zusammenfassung
Der Release-Bot verwendet jetzt interne gemeinsam genutzte Bibliotheken/Pakete und befindet sich in Monorepo. Dadurch ist es möglich, schnell neue Funktionen zu erstellen und Code in mehreren Anwendungen wiederzuverwenden.Bild von Gabriel Heinzer auf Unsplash
Das obige ist der detaillierte Inhalt vonErstellen und führen Sie Ihr Projekt in Monorepo mit PNPM aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!