#Загрузчик библиотек

Предварительно рекомендуется прочитать статью "Подключение внешних библиотек".


Движок OneScript в общем случае никак не регламентирует содержимое конкретной библиотеки. Когда компилятор встречает в коде директиву #Использовать он выполняет поиск указанного каталога библиотеки и запускает процедуру ее загрузки. При этом, алгоритм загрузки (знающий, как именно трактовать содержимое каталога библиотеки) может быть переопределен в специальном файле package-loader.os, который расположен в корне хранилища библиотек.

Структура корня библиотек

Модуль загрузчика вызывается движком OneScript в момент начала загрузки библиотеки. Примерная аналогия - модуль документа в платформе 1С:Предприятие. Система вызывает метод "ПередЗаписью" и позволяет разработчику как-то управлять процессом записи в БД.

Иными словами, в движке существует объект "Загрузчик", который имеет скриптовый модуль, определяемый извне движка.

##Общие принципы загрузки

Библиотека может добавить в область видимости скрипта 2 вида сущностей: классы и модули. Каждая библиотека может включать в себя неограниченное количество классов и модулей.

Класс

Под классом понимается новый тип в системе типов приложения. Экземпляры объектов этого типа создаются через оператор Новый.

	// подключаем функционал JSON
	#Использовать json

	Парсер = Новый ПарсерJSON(); // Тип ПарсерJSON объявлен в библиотеке

Модуль

Модуль это то же самое, что ОбщийМодуль в системе 1С:Предприятие. Модуль - это свойство в глобальном контексте, методы которого мы можем вызывать из языка.

	// подключаем функционал JSON
	#Использовать json

	Студент = Новый Структура("Имя,Фамилия", "Иван", "Петров");
	// Модуль "РаботаСJSON" объявлен в библиотеке и доступен благодаря директиве #Использовать
	РаботаСJSON.ЗаписатьОбъект(Студент, "C:\students.json");

#Объект "ЗагрузчикБиблиотек"

Внутренний объект системы, загружающий внешние объекты в область видимости приложения.

Методы

ДобавитьКласс(Знач ИмяФайла, Знач Идентификатор)

Метод регистрирует новый тип в системе типов. В параметре "ИмяФайла" передается имя файла, реализующего класс, в параметре "Идентификатор" - имя класса, как он будет выглядеть в системе.

// файл package-loader.os
ДобавитьКласс("C:\moneygen.os", "ГенераторДенег");

// файл основного скрипта
Генератор = Новый ГенераторДенег;
Генератор.ДайДенег(100500);

ДобавитьМодуль(Знач ИмяФайла, Знач Идентификатор)

Метод регистрирует новый модуль в глобальном контексте. В параметре "ИмяФайла" передается имя файла, реализующего модуль, в параметре "Идентификатор" - имя модуля, как он будет выглядеть в системе.

// файл package-loader.os
ДобавитьМодуль("C:\worldcontrol.os", "УправлениеМиром");

// файл основного скрипта
УправлениеМиром.СделатьВсемХорошо(Истина);

События

ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ)

Событие вызывается, когда система определила конкретный каталог библиотеки, перед попыткой загрузки этой библиотеки.

Параметры события

  • Путь - полный путь к каталогу загружаемой библиотеки.
  • СтандартнаяОбработка - позволяет использовать встроенный алгоритм загрузки (см. ниже)
  • Отказ - если обработчик события взводит флаг "Отказ", то генерируется ошибка "Библиотека не может быть загружена".

Стандартная обработка загрузки

Если обработчик не сбросил флаг стандартной обработки, то выполняется стандартный алгоритм загрузки:

  • Находятся файлы в каталоге библиотеки с расширением .os;
  • Если имя файла удовлетворяет правилам формирования идентификаторов он загружается, как модуль
  • Имя модуля будет таким же, как имя файла

Таким образом, если библиотека содержит только общие модули, то достаточно назвать файлы, как они должны выглядеть в языке и разместить их в каталоге библиотеки.