برنامه نویسی

چگونه راه‌اندازی توسعه دهنده CodeMirror v6 بسته‌ها را بدون monorepo بازیابی می‌کند

Summarize this content to 400 words in Persian Lang
در جامعه OSS، دیدن پروژه‌های monorepo که در آن فضاهای کاری و بسته‌ها همگی در یک مخزن قرار دارند، بسیار رایج است. CodeMirror سبک متفاوتی با نحوه مدیریت بسته ها دارد، هر بسته ای که استفاده می شود به تنهایی یک مخزن است. در این مقاله، ما تجزیه و تحلیل می‌کنیم که این بسته‌هایی که CodeMirror از آن‌ها استفاده می‌کنند و چگونه نصب می‌شوند زمانی که می‌خواهید CodeMirror v6 را به صورت محلی تنظیم کنید تا مشارکت داشته باشید، بررسی می‌کنیم.

قبل از اینکه تابع install را تجزیه و تحلیل کنیم، اجازه دهید ابتدا بسته‌های مختلفی را که CodeMirror را تشکیل می‌دهند، درک کنیم. شمااین بسته های فهرست شده در فایل bin/packages.js را پیدا خواهد کرد

اینها بسته های اصلی هستند:

exports.core = [
“state”,
“view”,
“language”,
“commands”,
“search”,
“autocomplete”,
“lint”,
“collab”,
“language-data”,
“codemirror”,
]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اینها در زیر بسته های غیر هسته ای هستند.

exports.nonCore = [
“lang-javascript”,
“lang-java”,
“lang-json”,
“lang-cpp”,
“lang-php”,
“lang-python”,
“lang-go”,
“lang-css”,
“lang-sass”,
“lang-html”,
“lang-sql”,
“lang-rust”,
“lang-xml”,
“lang-markdown”,
“lang-lezer”,
“lang-wast”,
“lang-angular”,
“lang-vue”,
“lang-liquid”,
“lang-less”,
“lang-yaml”,
“legacy-modes”,
“theme-one-dark”,
“merge”
]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما مخازنی را در سازمان CodeMirror برای همه این بسته های نشان داده شده در بالا پیدا خواهید کرد. هیچ مخزن واحدی وجود ندارد که همه این بسته ها را مانند یک monorepo داشته باشد، در عوض شما همه این مخازن را دارید که CodeMirror را تشکیل می دهند.

خواهید دید که این بسته ها از طریق تابعی به نام loadPackages قابل دسترسی هستند.

ممکن است تعجب کنید که در تصویر بالا، در خط 42، چه exports.all در اینجا آمده است. جالب است که چگونه concat در exports.core و exports.nonCore ساخته شده است و این شما باید همه این بسته ها را در یک آرایه ادغام کرده و به exports اختصاص دهید. .همه

let packages = exports.all.map(n => new Pkg(n))

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از map در exports.all، کلاس Pkg جدید با استفاده از کلاس Pkg که در زیر نشان داده شده است، نمونه سازی می شود:

class Pkg {
constructor(name) {
this.name = name
this.dir = join(__dirname, “..”, name)
this.main = null
if (name != “legacy-modes” && fs.existsSync(this.dir)) {
let files = fs.readdirSync(join(this.dir, “src”)).filter(f => /^[^.]+\.ts$/.test(f))
let main = files.length == 1 ? files[0] : files.includes(“index.ts”) ? “index.ts”
: files.includes(name.replace(/^(theme-|lang-)/, “”) + “.ts”) ? name.replace(/^(theme-|lang-)/, “”) + “.ts” : null
if (!main) throw new Error(“Couldn’t find a main script for ” + name)
this.main = join(this.dir, “src”, main)
}
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از نظر فنی تنظیم می شود name، dir و main.

let packageNames = Object.create(null)
for (let p of packages) packageNames[p.name] = p

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Object.create(null) یک شی خالی ایجاد می کند، این روشی جالب برای ایجاد یک Obj است که در غیر این صورت فقط می بود. obj = {} و در نهایت در زیر عبارت بازگشت است.

return {
packages,
packageNames,
buildPackages: packages.filter(p => p.main)
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در Thinkthroo، ما پروژه های بزرگ منبع باز را مطالعه می کنیم و راهنماهای معماری ارائه می دهیم. ما اجزای قابل استفاده مجدد را توسعه داده ایم که با tailwind ساخته شده اند که می توانید در پروژه خود از آنها استفاده کنید. ما خدمات توسعه Next.js، React و Node را ارائه می دهیم.

برای بحث در مورد پروژه خود یک جلسه با ما رزرو کنید.

https://github.com/codemirror/dev/blob/main/bin/cm.js#L81
https://github.com/codemirror/dev/blob/main/bin/packages.js
https://github.com/orgs/codemirror/repositories

در جامعه OSS، دیدن پروژه‌های monorepo که در آن فضاهای کاری و بسته‌ها همگی در یک مخزن قرار دارند، بسیار رایج است. CodeMirror سبک متفاوتی با نحوه مدیریت بسته ها دارد، هر بسته ای که استفاده می شود به تنهایی یک مخزن است. در این مقاله، ما تجزیه و تحلیل می‌کنیم که این بسته‌هایی که CodeMirror از آن‌ها استفاده می‌کنند و چگونه نصب می‌شوند زمانی که می‌خواهید CodeMirror v6 را به صورت محلی تنظیم کنید تا مشارکت داشته باشید، بررسی می‌کنیم.

قبل از اینکه تابع install را تجزیه و تحلیل کنیم، اجازه دهید ابتدا بسته‌های مختلفی را که CodeMirror را تشکیل می‌دهند، درک کنیم. شما

این بسته های فهرست شده در فایل bin/packages.js را پیدا خواهد کرد

توضیحات تصویر

اینها بسته های اصلی هستند:

exports.core = [
 "state",
 "view",
 "language",
 "commands",
 "search",
 "autocomplete",
 "lint",
 "collab",
 "language-data",
 "codemirror",
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اینها در زیر بسته های غیر هسته ای هستند.

exports.nonCore = [
 "lang-javascript",
 "lang-java",
 "lang-json",
 "lang-cpp",
 "lang-php",
 "lang-python",
 "lang-go",
 "lang-css",
 "lang-sass",
 "lang-html",
 "lang-sql",
 "lang-rust",
 "lang-xml",
 "lang-markdown",
 "lang-lezer",
 "lang-wast",
 "lang-angular",
 "lang-vue",
 "lang-liquid",
 "lang-less",
 "lang-yaml",
 "legacy-modes",
 "theme-one-dark",
 "merge"
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما مخازنی را در سازمان CodeMirror برای همه این بسته های نشان داده شده در بالا پیدا خواهید کرد. هیچ مخزن واحدی وجود ندارد که همه این بسته ها را مانند یک monorepo داشته باشد، در عوض شما همه این مخازن را دارید که CodeMirror را تشکیل می دهند.

خواهید دید که این بسته ها از طریق تابعی به نام loadPackages قابل دسترسی هستند.

توضیحات تصویر

ممکن است تعجب کنید که در تصویر بالا، در خط 42، چه exports.all در اینجا آمده است. جالب است که چگونه concat در exports.core و exports.nonCore ساخته شده است و این شما باید همه این بسته ها را در یک آرایه ادغام کرده و به exports اختصاص دهید. .همه

let packages = exports.all.map(n => new Pkg(n))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از map در exports.all، کلاس Pkg جدید با استفاده از کلاس Pkg که در زیر نشان داده شده است، نمونه سازی می شود:

class Pkg {
 constructor(name) {
 this.name = name
 this.dir = join(__dirname, "..", name)
 this.main = null
 if (name != "legacy-modes" && fs.existsSync(this.dir)) {
 let files = fs.readdirSync(join(this.dir, "src")).filter(f => /^[^.]+\.ts$/.test(f))
 let main = files.length == 1 ? files[0] : files.includes("index.ts") ? "index.ts"
 : files.includes(name.replace(/^(theme-|lang-)/, "") + ".ts") ? name.replace(/^(theme-|lang-)/, "") + ".ts" : null
 if (!main) throw new Error("Couldn't find a main script for " + name)
 this.main = join(this.dir, "src", main)
 }
 }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از نظر فنی تنظیم می شود name، dir و main.

let packageNames = Object.create(null)
for (let p of packages) packageNames[p.name] = p
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیحات تصویر

Object.create(null) یک شی خالی ایجاد می کند، این روشی جالب برای ایجاد یک Obj است که در غیر این صورت فقط می بود. obj = {} و در نهایت در زیر عبارت بازگشت است.

return {
  packages, 
  packageNames, 
  buildPackages: packages.filter(p => p.main)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در Thinkthroo، ما پروژه های بزرگ منبع باز را مطالعه می کنیم و راهنماهای معماری ارائه می دهیم. ما اجزای قابل استفاده مجدد را توسعه داده ایم که با tailwind ساخته شده اند که می توانید در پروژه خود از آنها استفاده کنید. ما خدمات توسعه Next.js، React و Node را ارائه می دهیم.

برای بحث در مورد پروژه خود یک جلسه با ما رزرو کنید.

توضیحات تصویر

  1. https://github.com/codemirror/dev/blob/main/bin/cm.js#L81

  2. https://github.com/codemirror/dev/blob/main/bin/packages.js

  3. https://github.com/orgs/codemirror/repositories

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا