برنامه نویسی

من کتابخانه پیکربندی ارگونومیک را ساخته ام

سلام به همه! من تازه آزاد کردم Zerocfg، کتابخانه Go Config من معتقدم که هستم ارگونومیک ترین می توانید استفاده کنید وقتی می گویم “ارگونومیک ترین” ، منظورم این است که نقاط درد دیرینه را در گردش کار پیکربندی سنتی Go برطرف می کند. بگذارید شما را از طریق مشکلاتی که با آنها روبرو شدم قدم بزنم – و اینکه چگونه Zerocfg آنها را حل می کند.


مشکلات رویکرد پیکربندی استاندارد GO

اکثر پروژه های GO پیکربندی را تقریباً به همان روش انجام می دهند – خواه از Viper ، Env ، Confita یا کتابخانه دیگری استفاده کنید:

  1. تعریف a struct برای پیکربندی شما
  2. سازه های لانه برای تنظیمات سلسله مراتبی.
  3. زمینه های برچسب با ابرداده (به عنوان مثال yaml:"token"با env:"TOKEN"، و غیره).
  4. نوشتن a Parse عمل در جایی برای تنظیم پیش فرض ، خواندن پرونده ها/env/پرچم ها و اعتبارسنجی.

صدا آشنا است؟ این چیزی است که من را در مورد آن اشکال می دهد:

1. Boilerplate و سه منبع حقیقت

هر بار که گزینه جدیدی اضافه می کنید ، باید:

  • یک زمینه را در یک ساختار اضافه کنید – به علاوه یک برچسب (و گاهی اوقات حتی یک ساختار جدید تو در تو).
  • در جای دیگر ، مقدار پیش فرض خود را اعلام کنید.
  • در یک مکان دیگر ، آن مقدار را به کد برنامه خود منتقل کنید.

هنگامی که خطوط کد مربوط به منطقی بسیار دور از هم زندگی می کنند ، این یک دستور العمل برای اشتباهات است:

  • علامت گذاری در برچسب ها می تواند بی صدا رفتار را بشکند ، به خصوص اگر پیش فرض اشتباه را پوشش دهد.
  • تغییر نام به کلیز که در همه جا به روز نشده اند و در تولید منفجر می شوند.
  • کار اضافی برای افزودن گزینه توسعه دهندگان را دلسرد می کند – بنابراین بسیاری از گزینه ها بدون در نظر گرفته می شوند یا به سختی کد می شوند.

2. پراکندگی پیکربندی

با گذشت زمان ، پیکربندی شما غیرقابل انکار می شود:

  • گزینه های بلااستفاده که هیچ کس هرس نکرد.
  • پیش فرض های از دست رفته که هیچ کس تنظیم نشده است.

هر دو باید گرفتار شوند بطور خودکار توسط یک کتابخانه پیکربندی عالی.


الهام: سادگی از flag

استاندارد flag بسته بندی در Go آن را برای پرچم های CLI درست می کند:

var dbHost = flag.String("db_host", "localhost", "database host")

func main() {
    flag.Parse()
    fmt.Println(*dbHost)
}
حالت تمام صفحه را وارد کنید

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

  • یک خط در هر گزینه: کلید ، مقدار پیش فرض و توضیحات همه در یک مکان.
  • یکی flag.Parse() فراخوانی کردن mainبشر
  • دیگ بخار صفر فراتر از آن

چرا نمی توانیم آن سطح سادگی را برای پیکربندی های YAML ، ENV و CLI داشته باشیم؟ به نظر می رسد هیچ کتابخانه موجود آن را میخکوب نمی کند – بنابراین من Zerocfg را ساختم.


معرفی Zerocfg – پیکربندی بدون سربار

Zerocfg flag فلسفه بسته بندی به منابع YAML ، ENV و CLI ، با قند و انعطاف پذیری اضافی.

مثال QuickStart

package main

import (
    "fmt"

    zfg "github.com/chaindead/zerocfg"
    "github.com/chaindead/zerocfg/env"
    "github.com/chaindead/zerocfg/yaml"
)

var (
    path = zfg.Str("config.path", "", "path to config file", zfg.Alias("c"))
    host = zfg.Str("db.host", "localhost", "database host")
)

func main() {
    if err := zfg.Parse(
        env.New(),          // environment variables
        yaml.New(path),     // YAML file (path comes from env or CLI)
    ); err != nil {
        panic(err)
    }

    fmt.Println("Current configuration:\n", zfg.Show())
    // CMD: go run ./... -c config.yml
    // OUTPUT:
    //   Current configuration:
    //     db.host = localhost  (database host)
}
حالت تمام صفحه را وارد کنید

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

آنچه از جعبه خارج می شوید

  1. منبع واحد حقیقت
    هر گزینه در حال زندگی است یکی خط: نام ، پیش فرض ، توضیحات و هر اصلاح کننده.
   var retries = zfg.Int("http.retries", 3, "number of HTTP retries")
حالت تمام صفحه را وارد کنید

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

  1. منابع قابل جمع شدن و اولویت بندی شده
    به ترتیب اولویت ، هر تعداد منابع را با هم ترکیب کنید:
   zfg.Parse(
     yaml.New(highPriorityConfig),
     yaml.New(lowPriorityConfig),
     env.New(),
   )
حالت تمام صفحه را وارد کنید

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

پرچم های CLI همیشه به طور پیش فرض در بالاترین اولویت قرار دارند.

  1. تشخیص زودرس کلیدهای ناشناخته
    zfg.Parse در گزینه های ناشناخته خطا خواهد کرد:
   err := zfg.Parse(env.New(), yaml.New(path))
   if unknown, ok := zfg.IsUnknown(err); ok {
       fmt.Println("Unknown options:", unknown)
   } else if err != nil {
       panic(err)
   }
حالت تمام صفحه را وارد کنید

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

  1. پیکربندی خود مستند
  • هر گزینه دارای یک رشته توضیحات است.
  • فراخوانی zfg.Show() برای چاپ یک پیکربندی فرمت شده با توضیحات.
  1. اصلاح کننده های گزینه
    گزینه های موجود در صورت نیاز ، راز ، نام مستعار و موارد دیگر را علامت گذاری کنید:
   password := zfg.Str("db.password", "", "database password", zfg.Secret(), zfg.Required())
حالت تمام صفحه را وارد کنید

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

  1. قابلیت گسترش آسان
  • منابع سفارشی: یک رابط ساده را برای بارگیری از هر چیزی (به عنوان مثال ، کنسول ، طاق) پیاده سازی کنید.
  • انواع گزینه های سفارشی: خودت را تعریف کن zfg.Type برای تجزیه مقادیر خاص.

چرا زحمت می کشید؟

من می دانم که تعداد زیادی از ما از Viper یا ENV خوشحالیم ، اما هر پروژه ای که من لمس کردم از Boilerplate ، علامت های دزدکی و بدهی های پیکربندی رنج می برد. Zerocfg تلاش من برای ایجاد شفافیت و سادگی به پیکربندی است.

امتحانش کن، آن را نقد کنید ، ویژگی ها را پیشنهاد دهید ، یا حتی مشارکت کنید! من دوست دارم نظرات شما را بشنوم و ببینم Zerocfg با جامعه رشد می کند.

– لذت ببرید ، و برنامه نویسی مبارک! 🚀

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

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

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

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