Bina dan jalankan projek anda di Monorepo dengan PNPM
Organisasi kod projek: Polyrepo lwn. Monorepo
Terdapat dua cara utama untuk mengatur kod projek:
- 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.
- 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:
pnpm init
Kemudian, cipta fail pnpm-workspace.yaml
yang menerangkan folder pakej:
// pnpm-workspace.yaml packages: - 'packages/**' - 'apps/**'
/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:
pnpm install
Buat Telegram Toolkit
Buat folder bernama /packages
dalam folder telegram-utils
dan mulakan PNPM dan TypeScript:
pnpm init && pnpm add -D typescript && pnpm tsc --init
Pakej ini akan menyediakan fungsi untuk menggabungkan teks dan kapsyen daripada semua mesej (teks, video dan foto). Pakej Telegraf perlu dipasang:
pnpm add telegraf
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:
// 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'); };
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
:
pnpm init
Gunakan medan package.json
dalam fail exports
untuk menyediakan eksport fungsi pakej:
// pnpm-workspace.yaml packages: - 'packages/**' - 'apps/**'
Untuk mengenal pasti pakej Monorepo dalam aplikasi anda, tambahkan awalan @monorepo
pada semua pakej. Namakan semula pakej package.json
dalam fail telegram-utils
:
pnpm install
Tambah skrip binaan:
pnpm init && pnpm add -D typescript && pnpm tsc --init
Fail package.json
lengkap:
pnpm add telegraf
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
:
// 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'); };
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:
// packages/telegram-utils/src/texts/index.ts export * from './combineTexts';
Pasang kebergantungan:
// packages/telegram-utils/package.json "exports": { "./texts": { "import": "./src/texts/index.ts", "require": "./dist/texts/index.js" } }
Kemas kini perintah preview
untuk menerbitkan bot:
// packages/telegram-utils/package.json "name": "@monorepo/telegram-utils"
Kemas kini/apps/publish-bot/tsconfig.json
:
// packages/telegram-utils/package.json "scripts": { "build": "tsc -p tsconfig.json" }
Sebelum membina kod aplikasi, anda perlu membina semua kebergantungan:
// 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" } }
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Soalan dan penyelesaian yang sering ditanya untuk percetakan tiket kertas terma depan dalam pembangunan front-end, percetakan tiket adalah keperluan umum. Walau bagaimanapun, banyak pemaju sedang melaksanakan ...

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Tidak ada gaji mutlak untuk pemaju Python dan JavaScript, bergantung kepada kemahiran dan keperluan industri. 1. Python boleh dibayar lebih banyak dalam sains data dan pembelajaran mesin. 2. JavaScript mempunyai permintaan yang besar dalam perkembangan depan dan stack penuh, dan gajinya juga cukup besar. 3. Faktor mempengaruhi termasuk pengalaman, lokasi geografi, saiz syarikat dan kemahiran khusus.

Perbincangan mengenai realisasi kesan animasi tatal dan elemen Parallax dalam artikel ini akan meneroka bagaimana untuk mencapai yang serupa dengan laman web rasmi Shiseido (https://www.shiseido.co.jp/sb/wonderland/) ... ...

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

Bagaimana cara menggabungkan elemen array dengan ID yang sama ke dalam satu objek dalam JavaScript? Semasa memproses data, kita sering menghadapi keperluan untuk mempunyai id yang sama ...

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Terokai pelaksanaan fungsi seretan panel dan drop panel seperti VSCode di bahagian depan. Dalam pembangunan front-end, bagaimana untuk melaksanakan vscode seperti ...
