Go: كيفية تضمين مكتبة خارجية واستبعاد التبعيات غير الضرورية



TL ؛ DR: منشئ الكود.



تخيل أنك تقوم بتطوير بعض المكتبات التي تدعم العديد من برامج تشغيل التخزين: Postgresql و Scylla و JSON وبعض المكتبات الأخرى.



كل من هذه المحركات لها تبعيات خارجية على مكتبات أخرى. Postgresql - قاعدة بيانات / SQL ، github.com/lib/pq. Scylla - github.com/scylladb/gocql أو github.com/gocql/gocql القياسي. JSON - github.com/mailru/easyjson أو github.com/json-iterator/go أو encoding / json.



.



, : Postgres , , .



, .







, . : sql.go, cql.go, json.go.



, .





pkger .



pkger —



    files := make([]string, 0)

    if *cql {
        files = append(files, pkger.Include("/cql.go"))
    }

    if *json {
        files = append(files, pkger.Include("/json.go"))
    }

    if *sql {
        files = append(files, pkger.Include("/sql.go"))
    }




pkger -o <   >


, .



go generate



//go:generate pkger -o <   >


, .





— Go, .



    for i := range files {
        _, filename := filepath.Split(files[i])

        in, err := pkger.Open(files[i])
        if err != nil {
            panic(err)
        }

        src := []byte(fmt.Sprintf(genStr, strings.Join(os.Args[1:], " ")))

        reader := bufio.NewReader(in)

        for {
            line, err := reader.ReadBytes('\n')
            if strings.HasPrefix(string(line), "package ") {
                line = []byte(fmt.Sprintf("package %s\n", *pkgName))
            }

            src = append(src, line...)

            if err == io.EOF {
                break
            }

            if err != nil {
                panic(err)
            }
        }

        if err := ioutil.WriteFile(filename, src, 0644); err != nil {
            panic(err)
        }

        in.Close()
    }


“cmd/< >”. , .







go get github.com/< >/< >/<  >


ثم يبدأ منشئ الكود في مشروعه



<    > -sql


عندما تحتاج إلى تحديث مكتبتك - يقوم المستخدم بتحديث منشئ الكود



go get -u github.com/< >/< >/<  >


وبعد ذلك يبدأ الجيل مرة أخرى.



مثال على هذا النهج في استخدام التبعيات هو أنا و كريكرتم تنفيذه في مكتبة nan : يمكنك العمل مع المكتبة في الوضع المعتاد ، من خلال الاستيراد ، وفي إصدار إنشاء الكود.




All Articles