【iniparser】项目配置工具iniparser的简单使用
项目配置工具iniparser
前言
对于很多程序中要用的参数如果是可变的,那么最好的处理方式就是通过main函数进行参数传递,或者从别的地方去获取,这其中之一的做法就是使用配置文件,在一个成熟和架构完善的系统中,一般都会做到自动配置,自动部署。
所以有的系统里会有一个单独的配置服务存在,其它的每个服务配置都会从配置中心服务获取。
运维人员会通过操作界面把配置信息下发到配置中心服务,其余服务从配置中心获取变更信息。
几乎每个大型互联网项目都会涉及到项目配置。
安装与构建
- git clone
git clone https://github.com/ndevilla/iniparser.git
- cd iniparser
- make
- 编译生成,.a为静态库,.so为动态库
测试
- 本测试项目目录树。
share_bike |-- conf | `-- share_bike.ini |-- git | `-- iniparser | |--略 |-- src | |-- CMakeLists.txt | |-- common | | |-- CMakeLists.txt | | |-- configdef.h | | |-- iniconfig.cpp | | |-- iniconfig.h | |-- main.cpp |-- test `-- third |-- include | `-- iniparser | |-- dictionary.h | `-- iniparser.h `-- lib `-- iniparser |-- libiniparser.a `-- libiniparser.so.1
- 注意:ubuntu下可以使用tree命令打印目录树。 tree
sudo apt-get install tree
- /src/common/configdef.h
#ifndef SHBK_COMMON_CONFIGDEF_H_
#define SHBK_COMMON_CONFIGDEF_H_
#include <string>
typedef struct st_env_config{
//数据库的配置
std::string db_ip;
unsigned short db_port;
std::string db_user;
std::string db_pwd;
std::string db_name;
//服务器的配置
unsigned short svr_port;
//构造函数
st_env_config(){
}
st_env_config(const std::string& db_ip, unsigned int db_port, const std::string& db_user,
const std::string& db_pwd, const std::string& db_name, unsigned short svr_port){
this->db_ip = db_ip;
this->db_port = db_port;
this->db_user = db_user;
this->db_pwd = db_pwd;
this->db_name = db_name;
this->svr_port = svr_port;
}
st_env_config& operator =(const st_env_config& config){
if (this != &config){
this->db_ip = config.db_ip;
this->db_port = config.db_port;
this->db_user = config.db_user;
this->db_pwd = config.db_pwd;
this->db_name = config.db_name;
this->svr_port = config.svr_port;
}
return *this;
}
}_st_env_config;
#endif
- /src/common/iniconfig.h
#ifndef SHBK_COMMON_INICONFIG_H_
#define SHBK_COMMON_INICONFIG_H_
#include <string>
#include "configdef.h"
class Iniconfig{
public:
Iniconfig();
~Iniconfig();
//加载配置
bool loadfile(const std::string& path);
//获取配置
const st_env_config& getconfig();
private:
st_env_config _config;
bool _isloaded;
};
#endif //SHBK_COMMON_INICONFIG_H_
- /src/common/iniconfig.cpp
#include "iniconfig.h"
#include <iniparser/iniparser.h>
Iniconfig::Iniconfig():_isloaded(false){
}
Iniconfig::~Iniconfig(){
}
bool Iniconfig::loadfile(const std::string& path){
dictionary* ini = NULL;
ini = iniparser_load(path.c_str());
if(ini == NULL){
fprintf(stderr,"cannot parse file:%s\n",path.c_str());
return false;
}
//拿到信息,字典,——区段:区段中的信息,默认值(如果没找到就取这个默认值)
const char* ip = iniparser_getstring(ini,"database:ip","127.0.0.1");
const int port = iniparser_getint(ini, "database:port", 3306);
const char* user = iniparser_getstring(ini, "database:user", "root");
const char* pwd = iniparser_getstring(ini, "database:pwd", "123456");
const char* db = iniparser_getstring(ini, "database:db", "dongnaobike");
const int sport = iniparser_getint(ini, "server:port", 9090);
//信息赋值
_config = st_env_config(std::string(ip), port, std::string(user),
std::string(pwd), std::string(db), sport);
//释放字典资源
iniparser_freedict(ini);
_isloaded = true;
return _isloaded;
}
const st_env_config& Iniconfig::getconfig(){
return _config;
}
- /src/common/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
# 搜集所有在指定路径下的源文件的文件名,将输出结果存储在指定的变量中
aux_source_directory(. SOURCES_COMMON_FILES)
# 构建库供其他模块使用
ADD_LIBRARY(common ${SOURCES_COMMON_FILES})
# 用来显式的定义变量
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations")
# 将指定目录添加到编译器的有文件搜索路径之下
INCLUDE_DIRECTORIES(../../third/include)
# 将指定目录添加到需要链接的库文件目录之下
LINK_DIRECTORIES(../../third/lib/iniparser)
# 将目标文件与库文件进行链接
TARGET_LINK_LIBRARIES(common iniparser)
TARGET_LINK_LIBRARIES(common dl)
- /src/main.cpp
#include "iniconfig.h" //注意路径,会在CMake中进行调整
#include "configdef.h"
int main(int argc,char** argv){
if(argc != 2){//缺少参数
printf("Please input shbk <config file path>!\n");
return -1;
}
Iniconfig config;
if(!config.loadfile(std::string(argv[1]))){
printf("load %s failed.\n",argv[1]);
return -2;
}
//测试是否读取成功
st_env_config conf_args = config.getconfig();
printf("[database]ip:%s\n [database]port:%d\n [database]user:%s\n [database]pwd:%s\n [database]db:%s\n [server]port:%d\n ",
conf_args.db_ip.c_str(),
conf_args.db_port,
conf_args.db_user.c_str(),
conf_args.db_pwd.c_str(),
conf_args.db_name.c_str(),
conf_args.svr_port);
return 0;
}
- /src/CMakeLists.txt
# CMake要求最低版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
# 工程名
PROJECT(share_bike)
# 将指定目录添加到编译器的头文件搜索路径之下
INCLUDE_DIRECTORIES(../third/include)
INCLUDE_DIRECTORIES(./common)
# 将指定目录添加到需要链接的库文件目录之下
LINK_DIRECTORIES(../third/lib/iniparser)
# 刚才在子文件夹中生成的库
LINK_DIRECTORIES(./common)
# 搜集所有在指定路径下的源文件的文件名,将输出的结果列表存储在指定的变量中
# 内置变量CMAKE_SOURCE_DIR 定义了顶级CMakeLists.txt所在的文件夹
# PROJECT_SOURCE_DIR 定义了包含最近的project()命令的CMakeLists.txt 所在的文件夹
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILES)
# 使用给定的源文件,为工程引入一个可执行文件
ADD_EXECUTABLE(share_bike ${SOURCE_FILES})
# GCC编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations")
TARGET_LINK_LIBRARIES(share_bike iniparser)
TARGET_LINK_LIBRARIES(share_bike common)
# 增加子目录
ADD_SUBDIRECTORY(common)
SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
INSTALL(TARGETS share_bike DESTINATION bin)
- /conf/share_bike.ini
[database]
ip = 127.0.0.1 ;
port = 3306 ;
user = root ;
pwd = 123456 ;
db = qiniubike;
[server]
port = 9090;
- 编译,在/src目录下
cmake .
make
- 执行
./share_bike ../conf/share_bike.ini