@ -8,6 +8,8 @@ import (
"io/ioutil"
"time"
"unsafe"
"os"
"strconv"
)
const (
@ -29,7 +31,7 @@ flush privileges;
*/
/*
你也可以在运行时的参数中临时修改一些配置项:
-MysqlHost=127.0.0.1 -MysqlPort=3306 -MysqlSchema=tank -MysqlUserN ame=tank -MysqlPassword=tank123
-MysqlHost=127.0.0.1 -MysqlPort=3306 -MysqlSchema=tank -MysqlUsern ame=tank -MysqlPassword=tank123
*/
var (
CONFIG = & Config {
@ -47,11 +49,11 @@ var (
//数据库名字
MysqlSchema : "tank" ,
//用户名
MysqlUserN ame : "tank" ,
MysqlUsern ame : "tank" ,
//密码
MysqlPassword : "tank123" ,
//数据库连接信息。这一项是上面几项组合而得,不可直接配置。
MysqlUrl : "%MysqlUserN ame:%MysqlPassword@tcp(%MysqlHost:%MysqlPort)/%MysqlSchema?charset=utf8&parseTime=True&loc=Local" ,
MysqlUrl : "%MysqlUsern ame:%MysqlPassword@tcp(%MysqlHost:%MysqlPort)/%MysqlSchema?charset=utf8&parseTime=True&loc=Local" ,
//超级管理员用户名,只能包含英文和数字
AdminUsername : "admin" ,
//超级管理员邮箱
@ -77,7 +79,7 @@ type Config struct {
//数据库名字
MysqlSchema string
//用户名
MysqlUserN ame string
MysqlUsern ame string
//密码
MysqlPassword string
//数据库连接信息。
@ -98,8 +100,8 @@ func (this *Config) validate() {
LogPanic ( "ServerPort 未配置" )
}
if this . MysqlUserN ame == "" {
LogPanic ( "MysqlUserN ame 未配置" )
if this . MysqlUsern ame == "" {
LogPanic ( "MysqlUsern ame 未配置" )
}
if this . MysqlPassword == "" {
@ -118,7 +120,7 @@ func (this *Config) validate() {
LogPanic ( "MysqlSchema 未配置" )
}
this . MysqlUrl = fmt . Sprintf ( "%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local" , this . MysqlUserN ame , this . MysqlPassword , this . MysqlHost , this . MysqlPort , this . MysqlSchema )
this . MysqlUrl = fmt . Sprintf ( "%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local" , this . MysqlUsern ame , this . MysqlPassword , this . MysqlHost , this . MysqlPort , this . MysqlSchema )
}
@ -143,11 +145,8 @@ func init() {
} , nil )
}
//从 conf/tank.json中获取变量。
//从flag中或者conf/tank.json中装填变量
func PrepareConfigs ( ) {
//第一级. 从配置文件 conf/tank.json中读取配置项
func LoadConfigFromFile ( ) {
//读取配置文件
filePath := GetConfPath ( ) + "/tank.json"
content , err := ioutil . ReadFile ( filePath )
@ -161,6 +160,65 @@ func PrepareConfigs() {
}
}
}
//第二级. 从环境变量中读取配置项
func LoadConfigFromEnvironment ( ) {
tmpServerPort := os . Getenv ( "TANK_SERVER_PORT" )
if tmpServerPort != "" {
i , e := strconv . Atoi ( tmpServerPort )
if e == nil {
CONFIG . ServerPort = i
} else {
LogPanic ( fmt . Sprintf ( "环境变量TANK_SERVER_PORT必须为整数! %v" , tmpServerPort ) )
}
}
tmpMysqlPort := os . Getenv ( "TANK_MYSQL_PORT" )
if tmpMysqlPort != "" {
i , e := strconv . Atoi ( tmpMysqlPort )
if e == nil {
CONFIG . MysqlPort = i
} else {
LogPanic ( fmt . Sprintf ( "环境变量TANK_MYSQL_PORT必须为整数! %v" , tmpMysqlPort ) )
}
}
tmpMysqlHost := os . Getenv ( "TANK_MYSQL_HOST" )
if tmpMysqlHost != "" {
CONFIG . MysqlHost = tmpMysqlHost
}
tmpMysqlSchema := os . Getenv ( "TANK_MYSQL_SCHEMA" )
if tmpMysqlSchema != "" {
CONFIG . MysqlSchema = tmpMysqlSchema
}
tmpMysqlUsername := os . Getenv ( "TANK_MYSQL_USERNAME" )
if tmpMysqlUsername != "" {
CONFIG . MysqlUsername = tmpMysqlUsername
}
tmpMysqlPassword := os . Getenv ( "TANK_MYSQL_PASSWORD" )
if tmpMysqlPassword != "" {
CONFIG . MysqlPassword = tmpMysqlPassword
}
tmpAdminUsername := os . Getenv ( "TANK_ADMIN_USERNAME" )
if tmpAdminUsername != "" {
CONFIG . AdminUsername = tmpAdminUsername
}
tmpAdminEmail := os . Getenv ( "TANK_ADMIN_EMAIL" )
if tmpAdminEmail != "" {
CONFIG . AdminEmail = tmpAdminEmail
}
tmpAdminPassword := os . Getenv ( "TANK_ADMIN_PASSWORD" )
if tmpAdminPassword != "" {
CONFIG . AdminPassword = tmpAdminPassword
}
}
//第三级. 从程序参数中读取配置项
func LoadConfigFromArguments ( ) {
//从运行时参数中读取,运行时参数具有更高优先级。
//系统端口号
ServerPortPtr := flag . Int ( "ServerPort" , CONFIG . ServerPort , "server port" )
@ -172,7 +230,7 @@ func PrepareConfigs() {
MysqlPortPtr := flag . Int ( "MysqlPort" , CONFIG . MysqlPort , "mysql port" )
MysqlHostPtr := flag . String ( "MysqlHost" , CONFIG . MysqlHost , "mysql host" )
MysqlSchemaPtr := flag . String ( "MysqlSchema" , CONFIG . MysqlSchema , "mysql schema" )
MysqlUserN amePtr := flag . String ( "MysqlUserN ame" , CONFIG . MysqlUserN ame , "mysql username" )
MysqlUsern amePtr := flag . String ( "MysqlUsern ame" , CONFIG . MysqlUsern ame , "mysql username" )
MysqlPasswordPtr := flag . String ( "MysqlPassword" , CONFIG . MysqlPassword , "mysql password" )
//超级管理员信息
@ -203,8 +261,8 @@ func PrepareConfigs() {
CONFIG . MysqlSchema = * MysqlSchemaPtr
}
if * MysqlUserN amePtr != CONFIG . MysqlUserN ame {
CONFIG . MysqlUserN ame = * MysqlUserN amePtr
if * MysqlUsern amePtr != CONFIG . MysqlUsern ame {
CONFIG . MysqlUsern ame = * MysqlUsern amePtr
}
if * MysqlPasswordPtr != CONFIG . MysqlPassword {
@ -223,6 +281,20 @@ func PrepareConfigs() {
CONFIG . AdminPassword = * AdminPasswordPtr
}
}
//三种方式指定配置项,后面的策略会覆盖前面的策略。
func PrepareConfigs ( ) {
//第一级. 从配置文件conf/tank.json中读取配置项
LoadConfigFromFile ( )
//第二级. 从环境变量中读取配置项
LoadConfigFromEnvironment ( )
//第三级. 从程序参数中读取配置项
LoadConfigFromArguments ( )
//验证配置项的正确性
CONFIG . validate ( )