Rumah >hujung hadapan web >tutorial js >Bina dan jalankan projek anda di Monorepo dengan PNPM

Bina dan jalankan projek anda di Monorepo dengan PNPM

Patricia Arquette
Patricia Arquetteasal
2025-01-19 16:33:12314semak imbas

Build and run your project in Monorepo with PNPM

Organisasi kod projek: Polyrepo lwn. Monorepo

Terdapat dua cara utama untuk mengatur kod projek:

  1. Polyrepo: Sebarkan kod projek dalam repositori yang berbeza. Ini adalah amalan standard semasa. Pelbagai pasukan mempunyai gudang mereka sendiri, membina produk dan saluran paip, dan mempunyai autonomi.
  2. Monorepo: Memusatkan semua kod projek dalam satu repositori. Projek dibahagikan kepada aplikasi dan pakej untuk memudahkan penggunaan semula kod dan berkongsi fungsi standard, yang membantu menyatukan versi pakej pihak ketiga, membina kod sumber secara rekursif untuk kebergantungan dan menggunakan alatan yang sama untuk saluran paip CI/CD.

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:

  • Fungsi ini memasukkan mesej yang dikumpulkan mengikut jenis: foto, video atau teks
  • Mesej media hendaklah ditukar kepada rentetan FMT yang mengandungi tajuk dan entiti tajuk. Untuk penapisan seterusnya, undefined hendaklah dikembalikan
  • Sambungkan tatasusunan teks langkah demi langkah, akhirnya menggabungkan semua teks menjadi satu mesej besar.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn