Skip to content

Instantly share code, notes, and snippets.

@artbear
Last active November 26, 2017 11:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save artbear/d5aefeb0517965cfcadec80d59bf4232 to your computer and use it in GitHub Desktop.
Save artbear/d5aefeb0517965cfcadec80d59bf4232 to your computer and use it in GitHub Desktop.
Файл загрузки библиотек package-loader.os - путь %OneScript%/lib - позволяет тестировать дев-библиотеки при наличии штатной библиотеки
Перем ПоказатьСообщенияЗагрузки;
Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ)
Вывести("
|ПриЗагрузкеБиблиотеки " + Путь);
ФайлМанифеста = Новый Файл(ОбъединитьПути(Путь, "lib.config"));
Если ФайлМанифеста.Существует() Тогда
СтандартнаяОбработка = Ложь;
ОбработатьМанифест(ФайлМанифеста.ПолноеИмя, Путь, Отказ);
Иначе
Вывести("ОбработатьСтруктуруКаталоговПоСоглашению");
ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ);
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьМанифест(Знач Файл, Знач Путь, Отказ)
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(Файл);
Чтение.ПерейтиКСодержимому();
Если Чтение.ЛокальноеИмя <> "package-def" Тогда
Отказ = Истина;
Чтение.Закрыть();
Возврат;
КонецЕсли;
Пока Чтение.Прочитать() и Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
Если Чтение.ЛокальноеИмя = "class" Тогда
ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file"));
Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда
Идентификатор = Чтение.ЗначениеАтрибута("name");
Если Не ПустаяСтрока(Идентификатор) Тогда
Вывести(СтрШаблон(" класс %1, файл %2", Идентификатор, ФайлКласса.ПолноеИмя));
// ДобавитьКласс(ФайлКласса.ПолноеИмя, Идентификатор);
ДобавитьКлассЕслиРанееНеДобавляли(ФайлКласса.ПолноеИмя, Идентификатор);
КонецЕсли;
Иначе
ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте";
КонецЕсли;
Чтение.Прочитать(); // в конец элемента
КонецЕсли;
Если Чтение.ЛокальноеИмя = "module" Тогда
ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file"));
Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда
Идентификатор = Чтение.ЗначениеАтрибута("name");
Если Не ПустаяСтрока(Идентификатор) Тогда
Вывести(СтрШаблон(" модуль %1, файл %2", Идентификатор, ФайлКласса.ПолноеИмя));
Попытка
ДобавитьМодуль(ФайлКласса.ПолноеИмя, Идентификатор);
Исключение
Сообщить("Предупреждение:
| " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Иначе
ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте";
КонецЕсли;
Чтение.Прочитать(); // в конец элемента
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
Процедура ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ)
КаталогКлассов = Новый Файл(ОбъединитьПути(Путь, "Классы"));
КаталогМодулей = Новый Файл(ОбъединитьПути(Путь, "Модули"));
Если КаталогКлассов.Существует() Тогда
Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os");
Для Каждого Файл Из Файлы Цикл
Вывести(СтрШаблон(" класс (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя));
СтандартнаяОбработка = Ложь;
// ДобавитьКласс(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
ДобавитьКлассЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
КонецЦикла;
КонецЕсли;
Если КаталогМодулей.Существует() Тогда
Файлы = НайтиФайлы(КаталогМодулей.ПолноеИмя, "*.os");
Для Каждого Файл Из Файлы Цикл
Вывести(СтрШаблон(" модуль (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя));
СтандартнаяОбработка = Ложь;
Попытка
ДобавитьМодуль(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
Исключение
СтандартнаяОбработка = Истина;
Сообщить("
|" + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьКлассЕслиРанееНеДобавляли(ПутьФайла, ИмяКласса)
КлассУжеЕсть = Ложь;
Попытка
Объект = Новый(ИмяКласса);
КлассУжеЕсть = Истина;
Исключение
// Сообщить("
// |" + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
// Сообщить("
// |" + ОписаниеОшибки());
СообщениеОшибки = ОписаниеОшибки();
ИскомаяОшибка = СтрШаблон("Конструктор не найден (%1)", ИмяКласса);
КлассУжеЕсть = СтрНайти(СообщениеОшибки, ИскомаяОшибка) = 0;
КонецПопытки;
Если Не КлассУжеЕсть Тогда
ДобавитьКласс(ПутьФайла, ИмяКласса);
КонецЕсли;
КонецПроцедуры
Процедура Вывести(Знач Сообщение)
Если ПоказатьСообщенияЗагрузки Тогда
Сообщить(Сообщение);
КонецЕсли;
КонецПроцедуры
ПоказатьСообщенияЗагрузки = Ложь;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment