Типы расположения проекта
В соответствии с данным стандартом, а также принятыми в ведущих дистрибутивах правилами размещения исполняемых файлов в каталогах пользователей, можно выделить следующие типы расположения:
-
системная иерархия в каталоге
/usr
используется для установки бинарных пакетов для данного дистрибутива; -
системная иерархия в каталоге
/usr/local
используется для установки программного обеспечения системным администратором без использования пакетов (не рекомендуется для использования из-за проблем поддержки в актуальном состоянии); -
системная иерархия в каталоге
/opt
используется для установки стороннего программного обеспечения. В рамках данной иерархии предполагается, что каждый программный продукт располагается в собственном каталоге. При таком типе сборки обычно используются дополнительные методы (статическая компоновка, включение в состав пакета своего набора динамических библиотек) для обеспечения работы пакета в операционных системам с отличающимся составом библиотек и другим циклом обновления; -
системная иерархия в домашнем каталоге пользователя не имеет определённого стандарта, обычно производители дистрибутивов предлагают использовать для исполняемых файлов каталоги
$HOME/bin
или$HOME/.local/bin
.
Система автоматизации сборки программного обеспечения CMake позволяет организовать окружение подобное перечисленным выше. На этапе сборки проекта можно создать структуру каталогов, которая будет отвечать требованиям по логическому разделению файлов на исполняемые, заголовочные, библиотеки, файлы настроек и т.д.
Автоматическая адаптация к текущему окружению
Для обеспечения единообразной работы вне зависимости от варианта иерархии каталогов, в которой находится исполняемый файл, можно выполнять автоматическую настройку на работу в текущем окружении.
В библиотеке myxlib реализован класс, который анализирует расположение и окружение исполняемого файла и предоставляет методы для получения имён каталогов, соответствующих текущему окружению. Названия методов и описания возвращаемых значений приведены в таблице.
Метод | Описание |
---|---|
|
Полный путь к домашнему каталогу текущего пользователя |
|
Полный путь к каталогу с временными файлами |
|
Полный путь к пользовательскому каталогу с файлами настройки |
|
Полный путь к пользовательскому каталогу с неизменяемыми файлами |
|
Полный путь к пользовательскому каталогу с изменяемыми файлами |
|
Полный путь к пользовательскому каталогу с журналами работы |
|
Полный путь к исполняемому файлу |
|
Полный путь к системному каталогу с файлами настройки |
|
Полный путь к системному каталогу с неизменяемыми файлами |
|
Полный путь к системному каталогу с изменяемыми файлами |
|
Полный путь к системному каталогу с журналами работы |
|
Полный путь к каталогу с исполняемым файлом |
|
Имя исполняемого файла |
|
Имя подкаталога для проекта |
Пример использования:
#include <myx/filesystem/paths.hpp>
namespace MF = myx::filesystem;
MF::Paths& paths = MF::Paths::instance();
paths.init();
qDebug() << paths.systemConstDataDirectory().path();
Правила выбора типа окружения
Класс myx::filesystem::Paths
реализован в виде синглтона,
чтобы повторно не выполнять проверку окружения в разных частях программы.
Сначала определяются имена пользовательского и временного каталогов с
помощью вызовов функций QDir::homePath
и QDir::tempPath
, затем
имена пользовательских каталогов для настроек, постоянных и изменяемых
данных и журналов. Эти значения не зависят от расположения исполняемого файла,
а определяются в соответствии со значениям переменных окружения HOME
,
TMPDIR
, XDG_CONFIG_HOME
и XDG_DATA_HOME
, либо устанавливаются значения,
принятые в стандартах. Пример имён каталогов для пользователя user
,
названия организации org
, названия выполняемой работы theme
и проекта
project
приведён в таблице.
Назначение каталога | Метод | Значение |
---|---|---|
Домашний каталог |
|
|
Временные файлы |
|
|
Файлы настройки |
|
|
Неизменяемые файлы |
|
|
Изменяемые файлы |
|
|
Журналы работы |
|
|
Общая проверка
Для определения типа текущего окружения используется полный путь
к исполняемому файлу, если он находится в каталоге bin
, то выполняются
проверки работы в одной из возможных вариантов иерархий,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Важно
|
При проверке типов иерархии всегда проверяется наличие всех необходимых каталогов, при отсутствии хотя бы одного будет принято решение, что файлы всех типов находятся в одном каталоге с исполняемым. |
Проверка на работу в иерархии /opt
Если полный путь к исполняемому файлу начинается с /opt
и
содержит в себе название текущего проекта, например
/opt/org-theme/project/bin/application
, то выполняется проверка
на наличие сопутствующих системных каталогов. Если они присутствуют,
то принимается решение, что окружение в иерархии /opt
сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
Назначение файла / каталога | Метод | Значение |
---|---|---|
Исполняемый файл |
|
|
Файлы настройки |
|
|
Неизменяемые файлы |
|
|
Изменяемые файлы |
|
|
Журналы работы |
|
|
Проверка на работу в иерархии /usr/local
Если полный путь к исполняемому файлу начинается с /usr/local
,
например /usr/local/bin/application
, то выполняется проверка
на наличие сопутствующих системных каталогов. Если они присутствуют,
то принимается решение, что окружение в иерархии /usr/local
сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
Назначение файла / каталога | Метод | Значение |
---|---|---|
Исполняемый файл |
|
|
Файлы настройки |
|
|
Неизменяемые файлы |
|
|
Изменяемые файлы |
|
|
Журналы работы |
|
|
Проверка на работу в иерархии /usr
Если полный путь к исполняемому файлу начинается с /usr
,
например /usr/bin/application
, то выполняется проверка
на наличие сопутствующих системных каталогов. Если они присутствуют,
то принимается решение, что окружение в иерархии /usr
сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
Назначение файла / каталога | Метод | Значение |
---|---|---|
Исполняемый файл |
|
|
Файлы настройки |
|
|
Неизменяемые файлы |
|
|
Изменяемые файлы |
|
|
Журналы работы |
|
|
Проверка на работу в домашнем каталоге
Если полный путь к исполняемому файлу начинается с /home/user/bin
или
/home/user/.local/bin
, например /home/user/bin/application
, то выполняется
проверка на наличие сопутствующих системных каталогов. Если они присутствуют,
то принимается решение, что окружение в домашнем каталоге сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
Назначение файла / каталога | Метод | Значение |
---|---|---|
Исполняемый файл |
|
|
Файлы настройки |
|
|
Неизменяемые файлы |
|
|
Изменяемые файлы |
|
|
Журналы работы |
|
|
Проверка на работу в окружении для разработки
Если исполняемый файл находится в каталоге bin
и при этом окружение не совпадает
ни с одним из перечисленных выше, то делается предположение, что исполняемый файл
запускается из окружения, сформированного системой управления проектом, и в данный
момент идёт разработка (отладка) приложения. В этом случае целесообразно считать
системными каталогами те, которые находятся внутри иерархии каталогов программного
проекта. Если присутствуют каталоги, созданные системой управления проекта,
то принимается решение, что окружение сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и на этом проверки заканчиваются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
Назначение файла / каталога | Метод | Значение |
---|---|---|
Исполняемый файл |
|
|
Файлы настройки |
|
|
Неизменяемые файлы |
|
|
Изменяемые файлы |
|
|
Журналы работы |
|
|
Расположение в одном каталоге
Если в ходе перечисленных выше проверок не удалось найти правильно сформированное окружение, то применяется настройка по умолчанию, которая соответствует ситуации, когда все типы файлов расположены в одном каталоге с исполняемым файлом. Пример для такого случая приведён в таблице.
Назначение файла / каталога | Метод | Значение |
---|---|---|
Исполняемый файл |
|
|
Файлы настройки |
|
|
Неизменяемые файлы |
|
|
Изменяемые файлы |
|
|
Журналы работы |
|
|