Rumah >hujung hadapan web >tutorial js >Bina dan jalankan projek anda di Monorepo dengan PNPM
Organisasi kod projek: Polyrepo lwn. Monorepo
Terdapat dua cara utama untuk mengatur kod projek:
Monorepo digunakan oleh banyak syarikat teknologi besar, seperti Yandex. Monorepo membantu berkongsi idea dan amalan terbaik di kalangan pasukan dan unit perniagaan. Untuk mendapatkan maklumat lanjut tentang Monorepo dan alatan berkaitan, sila lawati https://www.php.cn/link/b01ccf4f29b57b0b1bdb9407050db28d. Artikel ini akan memberi tumpuan kepada penyelesaian mudah untuk membina Monorepo menggunakan PNPM.
PNPM menggunakan ruang kerja untuk menyepadukan berbilang projek dalam satu repositori.
Persediaan persekitaran
Pertama, buat folder kosong sebagai projek Monorepo baharu. Mulakan PNPM di gudang:
<code class="language-bash">pnpm init</code>
Kemudian, cipta fail pnpm-workspace.yaml
yang menerangkan folder pakej:
<code class="language-yaml">// pnpm-workspace.yaml packages: - 'packages/**' - 'apps/**'</code>Folder
/packages
menyimpan pustaka kongsi dan folder /apps
menyimpan aplikasi (contohnya, aplikasi mudah alih React Native kendiri dan aplikasi web yang menggunakan komponen atau perpustakaan sambungan yang sama untuk berkomunikasi dengan pelayan API).
Artikel ini akan menggunakan robot penerbitan Telegram sebagai contoh Kod sumbernya terletak di GitHub: https://www.php.cn/link/8164ca2fe04767628ac1c6813e8a0867. Muat turun dan ekstrak ke folder /apps/publish-bot
, kemudian jalankan arahan pemasangan:
<code class="language-bash">pnpm install</code>
Buat Telegram Toolkit
Buat folder bernama /packages
dalam folder telegram-utils
dan mulakan PNPM dan TypeScript:
<code class="language-bash">pnpm init && pnpm add -D typescript && pnpm tsc --init</code>
Pakej ini akan menyediakan fungsi untuk menggabungkan teks dan kapsyen daripada semua mesej (teks, video dan foto). Pakej Telegraf perlu dipasang:
<code class="language-bash">pnpm add telegraf</code>
Semua kod sumber hendaklah terletak dalam direktori /src
. Untuk memudahkan pengelompokan berfungsi, adalah disyorkan untuk mencipta folder yang berbeza. Fungsi menggabungkan teks terletak dalam folder /texts
, kodnya adalah seperti berikut:
<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>
Perihalan kod:
undefined
hendaklah dikembalikan Buat fail indeks untuk folder /texts
:
<code class="language-bash">pnpm init</code>
Gunakan medan package.json
dalam fail exports
untuk menyediakan eksport fungsi pakej:
<code class="language-yaml">// pnpm-workspace.yaml packages: - 'packages/**' - 'apps/**'</code>
Untuk mengenal pasti pakej Monorepo dalam aplikasi anda, tambahkan awalan @monorepo
pada semua pakej. Namakan semula pakej package.json
dalam fail telegram-utils
:
<code class="language-bash">pnpm install</code>
Tambah skrip binaan:
<code class="language-bash">pnpm init && pnpm add -D typescript && pnpm tsc --init</code>
Fail package.json
lengkap:
<code class="language-bash">pnpm add telegraf</code>
Konfigurasikan pengkompil TypeScript: dayakan kompilasi tambahan untuk menjimatkan masa binaan dan proses hanya bahagian yang diubah; dayakan kompilasi kompaun untuk menggunakan rujukan projek. Tentukan folder /src
sebagai rootDir
dan outDir
pakej sebagai /dist
. Dikemas kini 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>
Integrasi
Kembali ke /apps/publish-bot
dan tambah pakej @monorepo/telegram-utils
pada kebergantungan. Ambil perhatian bahawa anda tidak perlu menentukan versi pakej, gunakan workspace:*
untuk menunjukkan:
<code class="language-typescript">// packages/telegram-utils/src/texts/index.ts export * from './combineTexts';</code>
Pasang kebergantungan:
<code class="language-json">// packages/telegram-utils/package.json "exports": { "./texts": { "import": "./src/texts/index.ts", "require": "./dist/texts/index.js" } }</code>
Kemas kini perintah preview
untuk menerbitkan bot:
<code class="language-json">// packages/telegram-utils/package.json "name": "@monorepo/telegram-utils"</code>
Kemas kini/apps/publish-bot/tsconfig.json
:
<code class="language-json">// packages/telegram-utils/package.json "scripts": { "build": "tsc -p tsconfig.json" }</code>
Sebelum membina kod aplikasi, anda perlu membina semua kebergantungan:
<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>
Ringkasan
Bot keluaran kini menggunakan perpustakaan/pakej kongsi dalaman dan terletak di Monorepo. Ini memungkinkan untuk membina ciri baharu dan menggunakan semula kod dengan cepat merentas berbilang aplikasi.
Imej melalui Gabriel Heinzer di Unsplash
Atas ialah kandungan terperinci Bina dan jalankan projek anda di Monorepo dengan PNPM. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!