4.12 آموزش کار با ini

4.12 آموزش کار با ini

بطور خلاصه فایل های ini.* جهت ذخیره تنظیمات مختلف استفاده می شود تنظیماتی مثل: آدرس خاص در شبکه، اطلاعات ورود به سیستم های مختلف و موارد از این قبیل.

برای شروع ساختار پروژه ما به این شکل است

1$ mkdir -p /tmp/ini 
2$ cd /tmp/ini 
3$ touch my.ini main.go 
4$ tree . . 
5├── main.go 
6└── my.ini

در پروژه دو فایل ایجاد کردیم یکی فایل اصلی برنامه main.go و دیگری my.ini که می خواهیم تنظیمات برنامه را در آن نگهداری کنیم. محتوای داخل فایل ini را بصورت ذیل تعریف کرده ایم

 1# possible values : production, development 
 2app_mode = development 
 3
 4[paths] 
 5# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) 
 6data = /home/git/grafana
 7 
 8[server] 
 9# Protocol (http or https) 
10protocol = http 
11
12# The http port to use 
13http_port = 9999 
14# Redirect to correct domain if host header does not match domain # Prevents DNS rebinding attacks 
15enforce_domain = true

همانطور که در توصیف کد آمده است 5 مقدار مختلف داخل فایل آمده است برخی را توضیح می دهیم

  1. مقدار app_mode که در واقع میخواهیم جهت تشخیص مود توسعه استفاده کنیم برای مثال به کمک این مقدار میخواهیم لاگ های برنامه در پروداکشن نمایش داده نشود ولی در زمان توسعه دهنده بتوانیم لاگ هایم مختلف را مشاهده کنیم.
  2. قسمت بعد protocol است که کاملا مشخص می باشد و در واقع میخواهیم پروتکل استفاده شده را مشخص کنیم
  3. حط بعد شماره پورت مورد استفاده برنامه است که مقدار 9999 می باشد

مقادیر وارد شده صرفا برای مثال می باشد و می توان هر مقداری را که در برنامه نیاز دارید ایجاد کنید.

 1package main 
 2import (
 3"fmt" 
 4"os" 
 5"gopkg.in/ini.v1"
 6) 
 7
 8func main() { 
 9cfg, err := ini.Load("my.ini")
10
11if err != nil { 
12fmt.Printf("Fail to read file: %v", err) 
13os.Exit(1) 
14}
15
16// Classic read of values, default section can be represented as empty string 
17fmt.Println("App Mode:", cfg.Section("").Key("app_mode").String()) 
18fmt.Println("Data Path:", cfg.Section("paths").Key("data").String()) 
19
20// Let's do some candidate value limitation 
21fmt.Println("Server Protocol:", 
22cfg.Section("server").Key("protocol").In("http", []string{"http", "https"})) 
23
24// Value read that is not in candidates will be discarded and fall back to given default value
25fmt.Println("Email Protocol:", cfg.Section("server").Key("protocol").In("smtp", []string{"imap", "smtp"})) 
26
27// Try out auto-type conversion 
28fmt.Printf("Port Number: (%[1]T) %[1]d\n", cfg.Section("server").Key("http_port").MustInt(9999)) 
29
30fmt.Printf("Enforce Domain: (%[1]T) %[1]v\n", cfg.Section("server").Key("enforce_domain").MustBool(false))
31
32// Now, make some changes and save it 
33cfg.Section("").Key("app_mode").SetValue("production") cfg.SaveTo("my.ini.local") 
34
35}

خروجی اجرای کد بالا به این شکل است

 1$ go run main.go
 2App Mode: development
 3Data Path: /home/git/grafana 
 4Server Protocol: http 
 5Email Protocol: smtp Port Number: (int) 9999 
 6Enforce Domain: (bool) true 
 7
 8$ cat my.ini.local 
 9# possible values : production, development 
10app_mode = production [paths] 
11# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) data = /home/git/grafana 
12...

کد بالا به اندازه کافی شفاف و ساده است که نیازی به توضیح بیشتر ندارد در ابتدا نیاز است تا بسته “gopkg.in/ini.v1” را به برنامه اضافه کنیم سپس با متد load فایل کانفیگ موجود را به حافظه بارگذاری می کنیم تا محتوای آن را بخوانیم و خط های بعد مقادیر آن را میخوانیم در خط پایانی نیز مقدار app_mode را به production تغییر دادیم و در فایل جدیدی به نام my.ini.local ذخیره کردیم .

می توانیم به شکل های مختلف یک فایل را بارگذاری یا ایجاد کنیم به مثال ذیل توجه کنید:

1cfg, err := ini.Load( []byte("raw data"),  // Raw data  
2					 "filename",           // File 
3					 ioutil.NopCloser(bytes.NewReader([]byte("some other data"))), 
4)

در این قطعه کد ما تنظیمات خود را به 3 شکل می توانیم فراخوانی کنیم رشته، فایل و io.ReadCloser البته در صورت نیاز می توانیم یک فایل خالی در فضای حافظه بشکل ذیل نیز ایجاد کنیم.

1cfg := ini.Empty()

در ابتدا می توانید هر تعداد فایل ini را بارگذاری و یا فرخوانی کنید ولیکن مواقعی نیاز دارید که یک منبع دیگر به آنها اضافه کنید که برای این منظور می توانید از دستور Append استفاده نمائید

1err := cfg.Append("other file", []byte("other raw data"))

و یا مواقعی از چند منبع اقدام به بارگذاری می نمائید که احتمال دارد برخی از آن منابع خطا در بارگذاری دهد در این شرایط بهتر از تابع   ()LooseLoadd استفاده کنید

1cfg, err := ini.LooseLoad("filename", "filename_404")

و در نهایت می توانید پس از تغییرات دلخواه فایل را بصورت ذیل ذخیره نمائید

1// ... 
2err = cfg.SaveTo("my.ini") 
3err = cfg.SaveToIndent("my.ini", "\t")

همانطور که در بالا دید برای دسترسی به یک قسمت از فایل ما از تابع Section بصورت ذیل استفاده می کنیم

1sec, err := cfg.GetSection("section name")

که در اینجا “section name” نام قطعه کد ما در فایل تنظیمات است. برخی از توابع مهم این بسته عبارت اند از : 1.

1err := cfg.NewSection("new section")

جهت ایجاد قطعه جدید 2.

1secs := cfg.Sections() 
2names := cfg.SectionStrings()

برای بدست آوردن تمامی قطعات داخل فایل 3.

1key, err := cfg.Section("").GetKey("app_mode")

برای بدست آوردن key یک section بطور مثال “app_mode” 4. ```go key, err := cfg.Section("").HasKey(“app_mode”)

برای بررسی وجود یک key
5. 
```go
key, err := cfg.Section("").NewKey("name", "value")

برای ایجاد یک key جدید