#c #c #json #cmake
#c #c #json #cmake
Вопрос:
У меня есть файл JSON с конфигурацией среды базы данных под названием env-config.json, подобный этому:
{
"LATEST":{
"DB_DATABASE":"databasename",
"DB_HOST":"hosturl",
"DB_PORT":"3306",
"DB_USER":"root",
"POOL_MAX":1
},
"PROD":{
"DB_DATABASE":"databasename",
"DB_HOST":"hosturl",
"DB_PORT":"3306",
"DB_USER":"root",
"POOL_MAX":1
}
}
находится в корне исходного кода проекта c
итак, я хочу легко использовать эту конфигурацию в формате json, но использовать ее, например, из моего скомпилированного кода c
когда программа выполняет запрос к системе, какая среда, например
system.getEnvironment()
система выдает «PROD»
в этот момент вызовите этот файл JSON и извлеките информацию для использования в программе.
проблема в том, что мне нужен метод для распространения json вместе с конечным исполняемым файлом. Я не могу содержать двоичный файл и файл json в отдельных файлах.
я пытаюсь с:
file (STRINGS "env-config.json" CONFIG)
add_definitions (-DENV_CONFIG=${CONFIG})
и после этого используйте эту строку в программе, но проблема в том, что сбой cmake из-за того, что все области из json, да, я могу поместить json в строковый формат с большим количеством n и областей, но я потеряю формат json для чтения.
Возможно ли, например, сохранить мой файл json в неизмененном виде в формате json, а во время сборки cmake преобразовать его в строку и после этого использовать
file (STRINGS "env-config.json" CONFIG)
add_definitions (-DENV_CONFIG=${CONFIG})
или, если это так сложно, потому что формат JSON
возможно ли использовать файл свойств, подобный java
db-${env}.properties
с этим содержимым
db.database.name = mydatabasename
db.database.url = myurl
db.database.user = root
db.database.password = root
и включить их вместе внутри исполняемого файла, как в MAP внутри класса конфигурации или структуры
Большое спасибо!
Комментарии:
1. Уверен, что это возможно. Вы пишете объявление карты или строки, точно так же, как объявление любой другой карты или строки, которая содержит любые ваши данные, которые вы хотите включить. Поскольку это, в значительной степени, обычный C , действительно неясно, о чем именно вы спрашиваете.
2. Добавьте текст в файл cpp, затем переключитесь в зависимости от конфигурации. Не помещайте конфигурацию в виде макроса, это плохо.
Ответ №1:
Я либо неправильно понимаю ваш вариант использования, либо вы упускаете важный момент о включении файла во время сборки.
Смысл наличия файла конфигурации JSON, если я правильно понимаю, заключается в том, чтобы системные администраторы могли настраивать приложение в любое время. Однако внедрение файла JSON в приложение во время сборки означает, что он будет запечен в исполняемый двоичный файл навсегда. Единственный способ внести изменения в файл JSON — это заново перестроить приложение.
Если это то, чего вы хотите, я бы предложил упростить вашу жизнь и сделать конфигурацию заголовочным файлом, который вы можете просто включить в свой исходный код (вместо JSON), подобным этому:
config.h
#define LATEST_DB_DATABASE "databasename"
#define LATEST_DB_HOST "hosturl"
#define LATEST_DB_PORT 3306
#define LATEST_DB_USER "root"
#define LATEST_POOL_MAX 1
#define PROD_DB_DATABASE "databasename",
#define PROD_DB_HOST "hosturl"
#define PROD_DB_PORT 3306
#define PROD_DB_USER "root"
#define PROD_POOL_MAX 1
Если это невозможно, то вам нужно написать скрипт сборки на любом языке, который считывает файл JSON и преобразует его в файл заголовка, подобный показанному, и этот заголовок включается в исходный код и компилируется с ним.
Однако, если вы не хотите включать файл JSON во время сборки, вам понадобится библиотека JSON, написанная на C, для чтения файла конфигурации во время выполнения.