-
Notifications
You must be signed in to change notification settings - Fork 5
/
package-loader.os
108 lines (87 loc) · 6.66 KB
/
package-loader.os
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Пояснения по переменным даны в конце модуля
Перем ПоказатьСообщенияЗагрузки;
Перем ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей;
Перем КэшМодулей;
Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ)
Вывести("
|ПриЗагрузкеБиблиотеки " + Путь);
Если Осень <> Неопределено Тогда
ПутьДоЗаготовки = ОбъединитьПути(Путь, "src/Заготовки/ИнициализацияСкучныхАннотаций.os");
ПодключитьСценарий(ПутьДоЗаготовки, "ИнициализацияСкучныхАннотаций");
Осень.ДобавитьЗаготовкуДляАвтоИнициализации("ИнициализацияСкучныхАннотаций");
мКаталог = ОбъединитьПути(Путь, "src/Классы");
ОбработатьКаталогКлассов(мКаталог, СтандартнаяОбработка, Отказ);
Иначе
ВызватьИсключение "Некорректный порядок импорта библиотек. Сначала подключите autumn";
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьКаталогКлассов(Знач Путь, СтандартнаяОбработка, Отказ)
КаталогКлассов = Новый Файл(Путь);
Если КаталогКлассов.Существует() Тогда
Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os");
Для Каждого Файл Из Файлы Цикл
Вывести(СтрШаблон(" класс (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя));
СтандартнаяОбработка = Ложь;
// ДобавитьКласс(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
ДобавитьКлассЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьКлассЕслиРанееНеДобавляли(ПутьФайла, ИмяКласса)
Вывести("Добавляю класс, если ранее не добавляли " + ИмяКласса);
Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда
Вывести("Добавляю класс " + ИмяКласса);
ДобавитьКласс(ПутьФайла, ИмяКласса);
Возврат;
КонецЕсли;
КлассУжеЕсть = Ложь;
Попытка
Объект = Новый(ИмяКласса);
КлассУжеЕсть = Истина;
Исключение
СообщениеОшибки = ОписаниеОшибки();
ИскомаяОшибка = СтрШаблон("Конструктор не найден (%1)", ИмяКласса);
КлассУжеЕсть = СтрНайти(СообщениеОшибки, ИскомаяОшибка) = 0;
КонецПопытки;
Если Не КлассУжеЕсть Тогда
Вывести("Добавляю класс, т.к. он не найден - " + ИмяКласса);
ДобавитьКласс(ПутьФайла, ИмяКласса);
Иначе
Вывести("Пропускаю загрузку класса " + ИмяКласса);
КонецЕсли;
КонецПроцедуры
Процедура Вывести(Знач Сообщение)
Если ПоказатьСообщенияЗагрузки Тогда
Сообщить(Сообщение);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьБулевоИзПеременнойСреды(Знач ИмяПеременнойСреды, Знач ЗначениеПоУмолчанию)
Рез = ЗначениеПоУмолчанию;
РезИзСреды = ПолучитьПеременнуюСреды(ИмяПеременнойСреды);
Если ЗначениеЗаполнено(РезИзСреды) Тогда
РезИзСреды = СокрЛП(РезИзСреды);
Попытка
Рез = Число(РезИзСреды) <> 0 ;
Исключение
Рез = ЗначениеПоУмолчанию;
Сообщить(СтрШаблон("Неверный формат переменной среды %1. Ожидали 1 или 0, а получили %2", ИмяПеременнойСреды, РезИзСреды));
КонецПопытки;
КонецЕсли;
Возврат Рез;
КонецФункции
// Если Истина, то выдаются подробные сообщения о порядке загрузке пакетов, классов, модулей, что помогает при анализе проблем
// очень полезно при анализе ошибок загрузки
// Переменная среды может принимать значение 0 (выключено) или 1 (включено)
// Значение флага по умолчанию - Ложь
ПоказатьСообщенияЗагрузки = ПолучитьБулевоИзПеременнойСреды(
"OSLIB_LOADER_TRACE", Ложь);
// Если Ложь, то пропускаются ошибки повторной загрузки классов/модулей,
//что важно при разработке/тестировании стандартных библиотек
// Если Истина, то выдается ошибка при повторной загрузке классов библиотек из движка
// Переменная среды может принимать значение 0 (выключено) или 1 (включено)
// Значение флага по умолчанию - Истина
ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей = ПолучитьБулевоИзПеременнойСреды(
"OSLIB_LOADER_DUPLICATES", Ложь);
// для установки других значений переменных среды и запуска скриптов можно юзать следующую командную строку
// (set OSLIB_LOADER_TRACE=1) && (oscript .\tasks\test.os)
КэшМодулей = Новый Массив;