Last active
November 26, 2017 11:28
-
-
Save artbear/d5aefeb0517965cfcadec80d59bf4232 to your computer and use it in GitHub Desktop.
Файл загрузки библиотек package-loader.os - путь %OneScript%/lib - позволяет тестировать дев-библиотеки при наличии штатной библиотеки
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Перем ПоказатьСообщенияЗагрузки; | |
Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ) | |
Вывести(" | |
|ПриЗагрузкеБиблиотеки " + Путь); | |
ФайлМанифеста = Новый Файл(ОбъединитьПути(Путь, "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