কীভাবে গোপনে কনফিগারেশন পরিচালনা করবেন [বন্ধ]


284

আমি যেতে প্রোগ্রামিং নতুন, এবং আমি হতাশ করছি: একটি যান প্রোগ্রামের জন্য হাতল কনফিগারেশন প্যারামিটার পছন্দের উপায় (কাপড় এক ধরনের ব্যবহার হতে পারে কি বৈশিষ্ট্য ফাইল বা স্টার জন্য ফাইল, অন্যান্য প্রসঙ্গে)?


আমি একটি গোলং-বাদাম থ্রেডও শুরু করেছি যার কয়েকটি অতিরিক্ত ধারণা রয়েছে।
theglauber

2
আমি শেল স্ক্রিপ্ট এবং পরিবেশের ভেরিয়েবল ব্যবহার করার প্রবণতা রাখি।
ডানফোন

3
আমি গোটিতে একটি সম্পূর্ণ ব্লগ পোস্ট উত্সাহিত করেছি যেখানে অ্যাপ্লিকেশন কনফিগারেশন গোপনে গিয়েছিলাম যেখানে আমি ব্যাখ্যা করেছি যে এটি দুটি সর্বাধিক জনপ্রিয় ফর্ম্যাটের উদাহরণ সহ কীভাবে করতে হয়: জসন এবং ওয়াইএএমএল। উদাহরণগুলি উত্পাদন প্রস্তুত।
upitau

কেবল রেকর্ডের জন্যই হাশিসর্প থেকে এইচসিএল রয়েছে যা মন্তব্যগুলিকে সমর্থন করে এবং এটি জেএসওএন এবং ইউসিএল সামঞ্জস্যপূর্ণ। github.com/hashicorp/hcl
Kaveh Shahbazian

উত্তর:


244

তাদেরকে JSON ফর্ম্যাটে বেশ ভাল আমার জন্য কাজ করেন। স্ট্যান্ডার্ড লাইব্রেরি ডাটা স্ট্রাকচারকে ইন্টেন্টেড লেখার জন্য বিভিন্ন পদ্ধতি সরবরাহ করে, তাই এটি বেশ পঠনযোগ্য।

এই গোলং-বাদামের থ্রেডটিও দেখুন ।

জেএসএনের সুবিধাগুলি হ'ল তালিকাগুলি এবং ম্যাপিংয়ের জন্য শব্দার্থবিজ্ঞানের প্রস্তাব দেওয়ার সময় এটি পার্সিং এবং মানব পাঠযোগ্য / সম্পাদনযোগ্য is

ব্যবহারের উদাহরণ:

conf.json :

{
    "Users": ["UserA","UserB"],
    "Groups": ["GroupA"]
}

কনফিগারেশন পড়তে প্রোগ্রাম

import (
    "encoding/json"
    "os"
    "fmt"
)

type Configuration struct {
    Users    []string
    Groups   []string
}

file, _ := os.Open("conf.json")
defer file.Close()
decoder := json.NewDecoder(file)
configuration := Configuration{}
err := decoder.Decode(&configuration)
if err != nil {
  fmt.Println("error:", err)
}
fmt.Println(configuration.Users) // output: [UserA, UserB]

6
দেখে মনে হচ্ছে যে জেএসএন বর্তমান বিকল্পগুলির মধ্যে সবচেয়ে কম খারাপ। আমি গো-ইয়ামলে দেখেছি এবং এটি একটি দুর্দান্ত প্রচেষ্টা, তবে আমি অন্য কোথাও দেখতে হবে এমন ইঙ্গিত হিসাবে ডকুমেন্টেশনের অভাব নিয়েছি। goini একটি সহজ এবং হাতল উইন্ডোজ সহজ গ্রন্থাগার হবে বলে মনে হয় স্টার ফাইল। টোমেল নামে একটি নতুন ফর্ম্যাট প্রস্তাব করা হয়েছে, তবে এতে সমস্যাও রয়েছে । এই মুহুর্তে আমি জেএসএন বা আইএনআই- তে আটকে থাকব ।
theglauber

6
ওয়াইএএমএল মন্তব্যগুলিকে সমর্থন করে, যদি আপনি কনফিগ ফাইলে সর্বত্র নোট যুক্ত করতে চান।
ইভান ব্ল্যাক

42
যারা এটি পড়ছেন এবং সেই পথে যাচ্ছেন তাদের জন্য সাবধান হন: জেএসএনএসের মন্তব্যের অভাব এটিকে একটি মানব ব্যবহারযোগ্য কনফিগারেশন ফাইলের জন্য উপযুক্ত নয় (ইমো)। এটি একটি ডেটা ইন্টারচেঞ্জ ফর্ম্যাট - আপনি কনফিগার ফাইলগুলিতে সহায়ক / বর্ণনামূলক মন্তব্য লেখার দক্ষতা হারাতে পারেন যা রক্ষণাবেক্ষণের ক্ষতি করতে পারে ("এই সেটিংটি কেন সক্রিয়?", "এটি কী করে?", "এর বৈধ মানগুলি কী? ? "ইত্যাদি)।
ডায়রিয়ান মুডি

6
আহ্ - আমি আমার কোডটিতে চেষ্টা করেছি এবং বড় হাতের অক্ষর (রফতানি হয়নি) দিয়ে কাঠামোর বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে ভুলে গেছি - এটি আমার জীবনের এক ঘন্টা ব্যয় করেছে। হতে পারে অন্যরাও একই ত্রুটি করে> সতর্ক করা উচিত; ডি
জনগ্যাল্ট

6
আপনার সম্ভবত defer file.Close()খোলার ত্রুটিটি পরীক্ষা করা উচিত
গ্যাব্রিয়েল

97

অন্য বিকল্পটি হল টোএমএল ব্যবহার করা , যা টম প্রেস্টন-ওয়ার্নারের তৈরি আইএনআই -র মতো বিন্যাস। আমি এর জন্য একটি গো পার্সার তৈরি করেছি যা ব্যাপকভাবে পরীক্ষিত হয় । আপনি এখানে প্রস্তাবিত অন্যান্য বিকল্পগুলির মতো এটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনার এই টোমেল ডেটা থাকেsomething.toml

Age = 198
Cats = [ "Cauchy", "Plato" ]
Pi = 3.14
Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z

তারপরে আপনি এটিকে এমন কিছু দিয়ে আপনার গো প্রোগ্রামে লোড করতে পারেন

type Config struct {
    Age int
    Cats []string
    Pi float64
    Perfection []int
    DOB time.Time
}

var conf Config
if _, err := toml.DecodeFile("something.toml", &conf); err != nil {
    // handle error
}

18
আমি টোমেল পছন্দ করি কারণ এটি আমাকে নিউলাইনগুলিতে বা একটি লাইন কনফিগারেশন সেটিংসের শেষে মন্তব্য লিখতে দেয়। আমি JSON দিয়ে এটি করতে পারি না।
সার্গের্গ

প্রতিটি কনফিগার আপডেটে কোডটিতে আপডেটের প্রয়োজন যা খুব বিরক্তিকর।
hywak

4
কনফিগার করার প্রতিটি পন্থা করে। কীভাবে আপনার প্রোগ্রামটি নতুন কনফিগারেশন সম্পর্কে সচেতন হবে?
বার্টসুশি 5

@ বার্টসুশি 5 টমল ফাইলের অতিরিক্ত ক্ষেত্র থাকতে পারে যা কোডের যত্ন নেয় না? মানে, কোডটির পুরানো সংস্করণটির সাথে কনফিগারেশন ফাইলের একটি নতুন সংস্করণ ব্যবহার করা যেতে পারে? অব্যক্ত কনফিগারেশন বিকল্পগুলি উপেক্ষা করা আমার ক্ষেত্রে ঠিক আছে।
ব্যবহারকারী 1952500

2
আমি এটা পছন্দ করি. ভাল কাজ. ব্যক্তিগতভাবে আমি মনে করি প্রশাসক বা গ্রাহকদের পক্ষে কোনও জেএসএনের চেয়ে একটি টোমেল ফাইল পরিবর্তন করা সহজ।
blndev

49

ভাইপার হ'ল গোলং কনফিগারেশন ম্যানেজমেন্ট সিস্টেম যা JSON, YAML এবং TOML এর সাথে কাজ করে। দেখতে বেশ আকর্ষণীয় লাগছে।


1
12 ফ্যাক্টর অ্যাপ্লিকেশনগুলির জন্য বিশেষত টেকসই 12factor.net
DerKnorr

Go এ JSON কনফিগারেশনের জন্য গনফিগ ব্যবহার করুন। github.com/eduardbcom/gonfig
এডুয়ার্ড

1
ভাইপার ব্যবহার করবেন না, এটি থ্রেড-নিরাপদ নয় যা আমাকে প্রায় ফেলে দিয়েছে।
igonejack

@igonejack দয়া করে একটি উদাহরণ দিন যেখানে ভাইপার আপনাকে কামড় দিয়েছে?
ডকিল

1
@ ডকিল পৃথক গাইরোটিনে আলাদা ভাইপার.গেটবুল ("এবিসি") এবং ভাইপার.সেট ("এবিসি", মিথ্যা) চেষ্টা করুন।
igonejack

44

আমি সাধারণত আরও জটিল ডেটা স্ট্রাকচারের জন্য জেএসএন ব্যবহার করি। নেতিবাচকতাটি হ'ল আপনি সহজেই একটি গুচ্ছ কোড দিয়ে শেষ করে ব্যবহারকারীকে ত্রুটিটি কোথায় ছিল, বিভিন্ন প্রান্তের মামলা এবং কী নয় তা জানান।

বেস কনফিগারেশনের জন্য (এপিআই কীস, পোর্ট নম্বর, ...) জিসিএফজি প্যাকেজটির সাথে আমার খুব ভাগ্য হয়েছে । এটি গিট কনফিগারেশনের ফর্ম্যাটের উপর ভিত্তি করে।

ডকুমেন্টেশন থেকে:

নমুনা কনফিগারেশন:

; Comment line
[section]
name = value # Another comment
flag # implicit value for bool is true

স্ট্রাক্ট যান:

type Config struct {
    Section struct {
            Name string
            Flag bool
    }
}

এবং কোডটি পড়ার জন্য প্রয়োজনীয়:

var cfg Config
err := gcfg.ReadFileInto(&cfg, "myconfig.gcfg")

এটি স্লাইস মানগুলিকেও সমর্থন করে, তাই আপনি একাধিকবার কী এবং এর মতো অন্যান্য দুর্দান্ত বৈশিষ্ট্য নির্দিষ্ট করার অনুমতি দিতে পারেন।


4
Gcfg এর মূল লেখক প্রকল্পটি বন্ধ করে দিয়েছেন এবং আরও একটি সম্পর্কিত স্কনফ শুরু করেছেন
আইওয়াত

39

ইনফ্লেগ সহ কেবল স্ট্যান্ডার্ড গো ফ্ল্যাগ ব্যবহার করুন ।

স্ট্যান্ডার্ড গো পতাকাগুলির নিম্নলিখিত সুবিধা রয়েছে:

  • কথ্য।
  • ব্যবহার করা সহজ. আপনার প্রকল্পটি যে স্বেচ্ছাসেবী প্যাকেজগুলি ব্যবহার করে তাতে সহজেই পতাকাগুলি যুক্ত করা যায় এবং ছড়িয়ে যায়।
  • পতাকাগুলি ডিফল্ট মান এবং বর্ণনার জন্য বাইরের বাইরে সমর্থন করে।
  • পতাকাগুলি ডিফল্ট মান এবং বর্ণনা সহ স্ট্যান্ডার্ড 'সহায়তা' আউটপুট সরবরাহ করে।

শুধুমাত্র ত্রুটিযুক্ত স্ট্যান্ডার্ড গো পতাকাগুলি হ'ল - আপনার অ্যাপ্লিকেশনে ব্যবহৃত পতাকার সংখ্যা খুব বেশি হয়ে গেলে পরিচালনা সমস্যা।

আইনিফ্ল্যাগগুলি মার্জিতভাবে এই সমস্যাটি সমাধান করে: আপনার মূল প্যাকেজটিতে কেবল দুটি লাইন সংশোধন করুন এবং এটি ম্যাজিকভাবে আইএনআই ফাইল থেকে পতাকা মানগুলি পড়ার জন্য সমর্থন অর্জন করে। কমান্ড-লাইনে নতুন মানগুলি পাস করে আইএনআই ফাইলগুলি থেকে পতাকাগুলি ওভাররাইড করা যেতে পারে।

বিশদ জানতে https://groups.google.com/forum/#!topic/golang-nuts/TByzyPgoAQE দেখুন ।


আমি যে প্রকল্পে কাজ করছি তার জন্য পতাকা ব্যবহার শুরু করেছি (আমার প্রথম থেকে স্ক্র্যাচ গোলং প্রকল্প), তবে আমি কীভাবে পরীক্ষার মতো জিনিসগুলি পরিচালনা করব তা ভাবছি? উদাহরণস্বরূপ, এটি একটি এপিআই ক্লায়েন্ট, এবং আমি পতাকাগুলি ব্যবহার করতে চাই তবে মনে হয় এটি আমার পরীক্ষাকে জটিল করে তুলবে ( go testআমাকে পতাকাগুলিতে প্রবেশ করতে দেয় না) যখন কোনও কনফিগার ফাইল না করে।
জাচায়সান

পরীক্ষা থেকে পতাকা সেট করা সহজ:*FlagName = value
স্টিভেন সোরোকা

9
এখানে কার্যকারী উদাহরণ দেখাচ্ছে বিশদ উদাহরণ কোড থাকলে খুব সহায়ক হবে :)
শূন্য_কুল

আপনার যখন অন্য ভাষায় লিখিত অ্যাপ্লিকেশনটির অন্যান্য অংশের সাথে কনফিগারেশন ভাগ করতে হবে তখন একটি ভাল ধারণা নয়।
কিরজিলা

পতাকা পরিবর্তে pflags ব্যবহার করার পরামর্শ দিতে হবে। পিএফ্লেগস পিক্সিক-স্ট্যান্ডার্ড ব্যবহার করছে
এফজলনির ডিভোরাক

12

আমি জিসিএফজি ব্যবহার শুরু করেছি যা ইনি-মতো ফাইল ব্যবহার করে। এটি সহজ - আপনি যদি কিছু সাধারণ চান, তবে এটি একটি ভাল পছন্দ।

এখানে বর্তমানে আমি লোডিং কোডটি ব্যবহার করছি, যার ডিফল্ট সেটিংস রয়েছে এবং এতে কমান্ড লাইন পতাকাগুলি প্রদর্শন করা হয় (প্রদর্শিত হয়নি) যা আমার কিছু কনফিগারটিকে ওভাররাইড করে:

package util

import (
    "code.google.com/p/gcfg"
)

type Config struct {
    Port int
    Verbose bool
    AccessLog string
    ErrorLog string
    DbDriver string
    DbConnection string
    DbTblPrefix string
}

type configFile struct {
    Server Config
}

const defaultConfig = `
    [server]
    port = 8000
    verbose = false
    accessLog = -
    errorLog  = -
    dbDriver     = mysql
    dbConnection = testuser:TestPasswd9@/test
    dbTblPrefix  =
`

func LoadConfiguration(cfgFile string, port int, verbose bool) Config {
    var err error
    var cfg configFile

    if cfgFile != "" {
        err = gcfg.ReadFileInto(&cfg, cfgFile)
    } else {
        err = gcfg.ReadStringInto(&cfg, defaultConfig)
    }

    PanicOnError(err)

    if port != 0 {
        cfg.Server.Port = port
    }
    if verbose {
        cfg.Server.Verbose = true
    }

    return cfg.Server
}

2
জিজ্ঞাসা ইতিমধ্যে উল্লিখিত ঠিক কি না?
নিমো

8

গনফিগ এ দেখুন

// load
config, _ := gonfig.FromJson(myJsonFile)
// read with defaults
host, _ := config.GetString("service/host", "localhost")
port, _ := config.GetInt("service/port", 80)
test, _ := config.GetBool("service/testing", false)
rate, _ := config.GetFloat("service/rate", 0.0)
// parse section into target structure
config.GetAs("service/template", &template)

এটি একটি ভাল, যেহেতু আমাকে গোটা কনফিগারেশনের কাঠামো পুনরায় সংজ্ঞায়িত করতে হবে না
থ্যানহপেক



5

আমি গোলাঙে একটি সাধারণ ইনআই কনফিগার লাইব্রেরি লিখেছি।

https://github.com/c4pt0r/cfg

গোরোটিন-নিরাপদ, ব্যবহার করা সহজ

package cfg
import (
    "testing"
)

func TestCfg(t *testing.T) {
    c := NewCfg("test.ini")
    if err := c.Load() ; err != nil {
        t.Error(err)
    }
    c.WriteInt("hello", 42)
    c.WriteString("hello1", "World")

    v, err := c.ReadInt("hello", 0)
    if err != nil || v != 42 {
        t.Error(err)
    }

    v1, err := c.ReadString("hello1", "")
    if err != nil || v1 != "World" {
        t.Error(err)
    }

    if err := c.Save(); err != nil {
        t.Error(err)
    }
}

=================== আপডেট =======================

সম্প্রতি আমার কাছে বিভাগ সমর্থন সহ একটি আইএনআই পার্সার প্রয়োজন এবং আমি একটি সাধারণ প্যাকেজ লিখি:

github.com/c4pt0r/cfg

আপনি "পতাকা" প্যাকেজ ব্যবহারের মতো INI কে পার্স করতে পারেন:

package main

import (
    "log"
    "github.com/c4pt0r/ini"
)

var conf = ini.NewConf("test.ini")

var (
    v1 = conf.String("section1", "field1", "v1")
    v2 = conf.Int("section1", "field2", 0)
)

func main() {
    conf.Parse()

    log.Println(*v1, *v2)
}

4

আপনি ইউনি- ইউনিভার্সাল কনফিগারেশন ল্যাঙ্গুয়েজ ইউসিএলের জন্য গো বাইন্ডিংগুলির একটি সেট গো -লিবুচলেও আগ্রহী হতে পারেন । ইউসিএল কিছুটা জেএসএনের মতো, তবে মানুষের পক্ষে আরও ভাল সহায়তার সাথে: এটি এসআই গুণক (10 কে, 40 এম, ইত্যাদি) মতামত এবং মানব-পঠনযোগ্য নির্মাণকে সমর্থন করে এবং কিছুটা কম বয়লারপ্লেট রয়েছে (যেমন, কীগুলির চারপাশে উদ্ধৃতি)। এটি ইতিমধ্যে nginx কনফিগারেশন ফাইল ফর্ম্যাটের খুব কাছে, যদি আপনি এর সাথে ইতিমধ্যে পরিচিত হন।


2

আমি নেমোর সাথে একমত এবং এটিকে সমস্ত বাস্তবকে সহজ করার জন্য আমি একটি ছোট সরঞ্জাম লিখেছি।

bitbucket.org/gotamer/cfg একটি json কনফিগারেশন প্যাকেজ

  • আপনি আপনার প্রয়োগে আপনার কনফিগার আইটেমগুলিকে স্ট্রাক্ট হিসাবে সংজ্ঞায়িত করেন।
  • আপনার স্ট্রাক্ট থেকে একটি জসন কনফিগারেশন ফাইল টেম্পলেট প্রথম রানে সংরক্ষণ করা হয়েছে
  • আপনি কনফিগে রানটাইম পরিবর্তনগুলি সংরক্ষণ করতে পারেন

উদাহরণের জন্য ডক.ওগো দেখুন


1

আমি JSON চেষ্টা করেছিলাম। এটা কাজ করেছে. তবে আমি সঠিক ক্ষেত্র এবং প্রকারগুলি নির্ধারণ করতে পারি তার ঘৃণা করি। আমার কাছে যে ব্যথা ছিল। আমি লক্ষ্য করেছি যে এটি আমার খুঁজে পেতে পারে এমন সমস্ত কনফিগারেশন বিকল্পগুলির দ্বারা ব্যবহৃত পদ্ধতি। ডায়নামিক ভাষাগুলিতে আমার পটভূমি আমাকে এ জাতীয় শব্দভাণ্ডারের সুবিধার জন্য অন্ধ করে তুলেছে। আমি একটি নতুন সাধারণ কনফিগার ফাইল ফর্ম্যাট তৈরি করেছি এবং এটি পড়ার জন্য আরও গতিশীল-ইশ লাইব।

https://github.com/chrisftw/ezconf

আমি গো বিশ্বে বেশ নতুন, তাই এটি গো পথে নাও হতে পারে। তবে এটি কাজ করে, এটি ব্যবহার করা বেশ দ্রুত এবং অতি সাধারণ।

পেশাদাররা

  • সুপার সিম্পল
  • কম কোড

কনস

  • কোনও অ্যারে বা মানচিত্রের ধরণ নেই
  • খুব ফ্ল্যাট ফাইল ফর্ম্যাট
  • অ-মানক কনফ ফাইল
  • একটি অন্তর্নির্মিত একটি সামান্য কনভেনশন আছে, যা আমি এখন গো সম্প্রদায়ে সাধারণভাবে তা ভেবে দেখি। (কনফিগারেশন ডিরেক্টরিতে কনফিগার ফাইলের সন্ধান করুন)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.