আমি যেতে প্রোগ্রামিং নতুন, এবং আমি হতাশ করছি: একটি যান প্রোগ্রামের জন্য হাতল কনফিগারেশন প্যারামিটার পছন্দের উপায় (কাপড় এক ধরনের ব্যবহার হতে পারে কি বৈশিষ্ট্য ফাইল বা স্টার জন্য ফাইল, অন্যান্য প্রসঙ্গে)?
আমি যেতে প্রোগ্রামিং নতুন, এবং আমি হতাশ করছি: একটি যান প্রোগ্রামের জন্য হাতল কনফিগারেশন প্যারামিটার পছন্দের উপায় (কাপড় এক ধরনের ব্যবহার হতে পারে কি বৈশিষ্ট্য ফাইল বা স্টার জন্য ফাইল, অন্যান্য প্রসঙ্গে)?
উত্তর:
তাদেরকে 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]
defer file.Close()
খোলার ত্রুটিটি পরীক্ষা করা উচিত
অন্য বিকল্পটি হল টোএমএল ব্যবহার করা , যা টম প্রেস্টন-ওয়ার্নারের তৈরি আইএনআই -র মতো বিন্যাস। আমি এর জন্য একটি গো পার্সার তৈরি করেছি যা ব্যাপকভাবে পরীক্ষিত হয় । আপনি এখানে প্রস্তাবিত অন্যান্য বিকল্পগুলির মতো এটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনার এই টোমেল ডেটা থাকে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
}
ভাইপার হ'ল গোলং কনফিগারেশন ম্যানেজমেন্ট সিস্টেম যা JSON, YAML এবং TOML এর সাথে কাজ করে। দেখতে বেশ আকর্ষণীয় লাগছে।
আমি সাধারণত আরও জটিল ডেটা স্ট্রাকচারের জন্য জেএসএন ব্যবহার করি। নেতিবাচকতাটি হ'ল আপনি সহজেই একটি গুচ্ছ কোড দিয়ে শেষ করে ব্যবহারকারীকে ত্রুটিটি কোথায় ছিল, বিভিন্ন প্রান্তের মামলা এবং কী নয় তা জানান।
বেস কনফিগারেশনের জন্য (এপিআই কীস, পোর্ট নম্বর, ...) জিসিএফজি প্যাকেজটির সাথে আমার খুব ভাগ্য হয়েছে । এটি গিট কনফিগারেশনের ফর্ম্যাটের উপর ভিত্তি করে।
ডকুমেন্টেশন থেকে:
নমুনা কনফিগারেশন:
; 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")
এটি স্লাইস মানগুলিকেও সমর্থন করে, তাই আপনি একাধিকবার কী এবং এর মতো অন্যান্য দুর্দান্ত বৈশিষ্ট্য নির্দিষ্ট করার অনুমতি দিতে পারেন।
ইনফ্লেগ সহ কেবল স্ট্যান্ডার্ড গো ফ্ল্যাগ ব্যবহার করুন ।
স্ট্যান্ডার্ড গো পতাকাগুলির নিম্নলিখিত সুবিধা রয়েছে:
শুধুমাত্র ত্রুটিযুক্ত স্ট্যান্ডার্ড গো পতাকাগুলি হ'ল - আপনার অ্যাপ্লিকেশনে ব্যবহৃত পতাকার সংখ্যা খুব বেশি হয়ে গেলে পরিচালনা সমস্যা।
আইনিফ্ল্যাগগুলি মার্জিতভাবে এই সমস্যাটি সমাধান করে: আপনার মূল প্যাকেজটিতে কেবল দুটি লাইন সংশোধন করুন এবং এটি ম্যাজিকভাবে আইএনআই ফাইল থেকে পতাকা মানগুলি পড়ার জন্য সমর্থন অর্জন করে। কমান্ড-লাইনে নতুন মানগুলি পাস করে আইএনআই ফাইলগুলি থেকে পতাকাগুলি ওভাররাইড করা যেতে পারে।
বিশদ জানতে https://groups.google.com/forum/#!topic/golang-nuts/TByzyPgoAQE দেখুন ।
go test
আমাকে পতাকাগুলিতে প্রবেশ করতে দেয় না) যখন কোনও কনফিগার ফাইল না করে।
*FlagName = value
আমি জিসিএফজি ব্যবহার শুরু করেছি যা ইনি-মতো ফাইল ব্যবহার করে। এটি সহজ - আপনি যদি কিছু সাধারণ চান, তবে এটি একটি ভাল পছন্দ।
এখানে বর্তমানে আমি লোডিং কোডটি ব্যবহার করছি, যার ডিফল্ট সেটিংস রয়েছে এবং এতে কমান্ড লাইন পতাকাগুলি প্রদর্শন করা হয় (প্রদর্শিত হয়নি) যা আমার কিছু কনফিগারটিকে ওভাররাইড করে:
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
}
গনফিগ এ দেখুন
// 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)
https://github.com/spf13/viper এবং https://github.com/zpatrick/go-config কনফিগারেশন ফাইলগুলির জন্য বেশ ভাল গ্রন্থাগার।
এই নিবন্ধটির মতো টমল ব্যবহার করুন কনফিগারেশন ফাইলগুলি পড়ার উপায়
আমি গোলাঙে একটি সাধারণ ইনআই কনফিগার লাইব্রেরি লিখেছি।
গোরোটিন-নিরাপদ, ব্যবহার করা সহজ
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)
}
আপনি ইউনি- ইউনিভার্সাল কনফিগারেশন ল্যাঙ্গুয়েজ ইউসিএলের জন্য গো বাইন্ডিংগুলির একটি সেট গো -লিবুচলেও আগ্রহী হতে পারেন । ইউসিএল কিছুটা জেএসএনের মতো, তবে মানুষের পক্ষে আরও ভাল সহায়তার সাথে: এটি এসআই গুণক (10 কে, 40 এম, ইত্যাদি) মতামত এবং মানব-পঠনযোগ্য নির্মাণকে সমর্থন করে এবং কিছুটা কম বয়লারপ্লেট রয়েছে (যেমন, কীগুলির চারপাশে উদ্ধৃতি)। এটি ইতিমধ্যে nginx কনফিগারেশন ফাইল ফর্ম্যাটের খুব কাছে, যদি আপনি এর সাথে ইতিমধ্যে পরিচিত হন।
আমি নেমোর সাথে একমত এবং এটিকে সমস্ত বাস্তবকে সহজ করার জন্য আমি একটি ছোট সরঞ্জাম লিখেছি।
bitbucket.org/gotamer/cfg একটি json কনফিগারেশন প্যাকেজ
উদাহরণের জন্য ডক.ওগো দেখুন
আমি JSON চেষ্টা করেছিলাম। এটা কাজ করেছে. তবে আমি সঠিক ক্ষেত্র এবং প্রকারগুলি নির্ধারণ করতে পারি তার ঘৃণা করি। আমার কাছে যে ব্যথা ছিল। আমি লক্ষ্য করেছি যে এটি আমার খুঁজে পেতে পারে এমন সমস্ত কনফিগারেশন বিকল্পগুলির দ্বারা ব্যবহৃত পদ্ধতি। ডায়নামিক ভাষাগুলিতে আমার পটভূমি আমাকে এ জাতীয় শব্দভাণ্ডারের সুবিধার জন্য অন্ধ করে তুলেছে। আমি একটি নতুন সাধারণ কনফিগার ফাইল ফর্ম্যাট তৈরি করেছি এবং এটি পড়ার জন্য আরও গতিশীল-ইশ লাইব।
https://github.com/chrisftw/ezconf
আমি গো বিশ্বে বেশ নতুন, তাই এটি গো পথে নাও হতে পারে। তবে এটি কাজ করে, এটি ব্যবহার করা বেশ দ্রুত এবং অতি সাধারণ।