diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" index bae2e62..87cdcfb 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" @@ -12,7 +12,7 @@ Перем Лог; Перем РабочийКаталог; Перем ВремКаталогСборки; -Перем ОбработчикСобытийСборки; +Перем ОбработчикСобытий; ////////////////////////////////////////////////////////// // Сборка пакета @@ -35,9 +35,8 @@ Лог.Информация("Начинаю сборку в каталоге " + РабочийКаталог); УстановитьТекущийКаталог(РабочийКаталог); УточнитьФайлМанифеста(ФайлМанифеста); - ИнициализироватьОбработчикСобытийСборки(); - ВызватьСобытиеПередСборкой(); Манифест = ПрочитатьМанифест(ФайлМанифеста); + ВызватьСобытиеПередСборкой(); СобратьПакетВКаталогеСборки(Манифест, ВыходнойКаталог); УстановитьТекущийКаталог(ТекущийРабКаталог); Лог.Информация("Сборка пакета завершена"); @@ -70,25 +69,12 @@ КонецПроцедуры -Процедура ИнициализироватьОбработчикСобытийСборки() - ОбработчикСобытийСборки = Неопределено; - ИмяСкриптаСборки = КонстантыOpm.ИмяФайлаСкриптаСборки; - - ПутьКФайлуСборки = ОбъединитьПути(ТекущийКаталог(), ИмяСкриптаСборки); - Если НЕ ФС.ФайлСуществует(ПутьКФайлуСборки) Тогда - Возврат; - КонецЕсли; - - Лог.Отладка("Найден скрипт сборки пакета"); - ОбработчикСобытийСборки = ЗагрузитьСценарий(ПутьКФайлуСборки); -КонецПроцедуры - Функция ПрочитатьМанифест(Знач ФайлМанифеста) ОписаниеПакета = Новый ОписаниеПакета(); Лог.Информация("Загружаю описание пакета..."); ВнешнийКонтекст = Новый Структура("Описание", ОписаниеПакета); - Манифест = ЗагрузитьСценарий(ФайлМанифеста, ВнешнийКонтекст); + ОбработчикСобытий = ЗагрузитьСценарий(ФайлМанифеста, ВнешнийКонтекст); Лог.Информация("Описание пакета прочитано"); Возврат ОписаниеПакета; @@ -116,7 +102,7 @@ КонецПроцедуры -Процедура ДобавитьОписаниеМетаданныхПакета(Знач Архив, Знач Манифест); +Процедура ДобавитьОписаниеМетаданныхПакета(Знач Архив, Знач Манифест) ПутьМанифеста = ОбъединитьПути(ВремКаталогСборки, "opm-metadata.xml"); Запись = Новый ЗаписьXML; @@ -202,38 +188,26 @@ КонецПроцедуры Процедура ВызватьСобытиеПередСборкой() - Если ОбработчикСобытийСборки = Неопределено Тогда - Возврат; - КонецЕсли; - Рефлектор = Новый Рефлектор; - Если Рефлектор.МетодСуществует(ОбработчикСобытийСборки, "ПередСборкой") Тогда + Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПередСборкой") Тогда Лог.Отладка("Вызываю событие ПередСборкой"); - ОбработчикСобытийСборки.ПередСборкой(РабочийКаталог); + ОбработчикСобытий.ПередСборкой(РабочийКаталог); КонецЕсли; КонецПроцедуры Процедура ВызватьСобытиеПриСборке(АрхивПакета) - Если ОбработчикСобытийСборки = Неопределено Тогда - Возврат; - КонецЕсли; - Рефлектор = Новый Рефлектор; - Если Рефлектор.МетодСуществует(ОбработчикСобытийСборки, "ПриСборке") Тогда + Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПриСборке") Тогда Лог.Отладка("Вызываю событие ПриСборке"); - ОбработчикСобытийСборки.ПриСборке(РабочийКаталог, АрхивПакета); + ОбработчикСобытий.ПриСборке(РабочийКаталог, АрхивПакета); КонецЕсли; КонецПроцедуры Процедура ВызватьСобытиеПослеСборки(ПутьКФайлуПакета) - Если ОбработчикСобытийСборки = Неопределено Тогда - Возврат; - КонецЕсли; - Рефлектор = Новый Рефлектор; - Если Рефлектор.МетодСуществует(ОбработчикСобытийСборки, "ПослеСборки") Тогда + Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПослеСборки") Тогда Лог.Отладка("Вызываю событие ПослеСборки"); - ОбработчикСобытийСборки.ПослеСборки(РабочийКаталог, ПутьКФайлуПакета); + ОбработчикСобытий.ПослеСборки(РабочийКаталог, ПутьКФайлуПакета); КонецЕсли; КонецПроцедуры @@ -264,9 +238,6 @@ СоздатьПодкаталог(ВыходнойКаталог.ПолноеИмя, "tests"); СоздатьПодкаталог(ВыходнойКаталог.ПолноеИмя, "docs"); - ЗаписатьЗаготовкуСкриптаУстановки(ВыходнойКаталог.ПолноеИмя); - ЗаписатьЗаготовкуСкриптаСборки(ВыходнойКаталог.ПолноеИмя); - ЗаписатьЗаготовкуМанифестаБиблиотеки(ВыходнойКаталог.ПолноеИмя, ИмяПакета); Лог.Информация("Готово"); @@ -278,29 +249,16 @@ СоздатьКаталог(ОбъединитьПути(База, Имя)); КонецПроцедуры -Процедура ЗаписатьЗаготовкуСкриптаУстановки(Знач Каталог) +Процедура ЗаписатьЗаготовкуСкриптаУстановки(ЗаписьТекста) - Лог.Информация("Создаю заготовку скрипта установки/удаления"); + Лог.Информация("Создаю процедур установки/удаления"); - ИмяФайла = ОбъединитьПути(Каталог, КонстантыOpm.ИмяФайлаСкриптаУстановки); - ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла); ЗаписьТекста.ЗаписатьСтроку("///////////////////////////////////////////////////////////////////"); - ЗаписьТекста.ЗаписатьСтроку("// Сценарий установки и удаления пакета с клиентской машины "); + ЗаписьТекста.ЗаписатьСтроку("// Процедуры установки пакета с клиентской машины "); ЗаписьТекста.ЗаписатьСтроку("/////////////////////////////////////////////////////////////////// | |"); - - ЗаписьТекста.ЗаписатьСтроку("// Вызывается пакетным менеджером перед установкой пакета на клиентскую машину."); - ЗаписьТекста.ЗаписатьСтроку("// "); - ЗаписьТекста.ЗаписатьСтроку("// Параметры:"); - ЗаписьТекста.ЗаписатьСтроку("// АрхивПакета - ЧтениеZipФайла. Открытый архив пакета."); - ЗаписьТекста.ЗаписатьСтроку("// КаталогУстановкиПакета - строка. Путь в который пакетный менеджер устанавливает текущий пакет."); - ЗаписьТекста.ЗаписатьСтроку("// "); - ЗаписьТекста.ЗаписатьСтроку("Процедура ПередУстановкой(Знач АрхивПакета, Знач КаталогУстановкиПакета, СтандартнаяОбработка) Экспорт"); - ЗаписьТекста.ЗаписатьСтроку(" // TODO: Реализуйте спец. логику установки, если требуется"); - ЗаписьТекста.ЗаписатьСтроку("КонецПроцедуры"); - ЗаписьТекста.ЗаписатьСтроку(Символы.ПС); - + ЗаписьТекста.ЗаписатьСтроку("// Вызывается пакетным менеджером после распаковки пакета на клиентскую машину."); ЗаписьТекста.ЗаписатьСтроку("// "); ЗаписьТекста.ЗаписатьСтроку("// Параметры:"); @@ -310,28 +268,15 @@ ЗаписьТекста.ЗаписатьСтроку(" // TODO: Реализуйте спец. логику установки, если требуется"); ЗаписьТекста.ЗаписатьСтроку("КонецПроцедуры"); ЗаписьТекста.ЗаписатьСтроку(Символы.ПС); - - ЗаписьТекста.ЗаписатьСтроку("// Вызывается пакетным менеджером при удалении пакета с клиентской машины."); - ЗаписьТекста.ЗаписатьСтроку("// "); - ЗаписьТекста.ЗаписатьСтроку("// Параметры:"); - ЗаписьТекста.ЗаписатьСтроку("// КаталогУстановкиПакета - строка. Каталог в который установлен пакет."); - ЗаписьТекста.ЗаписатьСтроку("// "); - ЗаписьТекста.ЗаписатьСтроку("Процедура ПриУдалении(Знач КаталогУстановкиПакета) Экспорт"); - ЗаписьТекста.ЗаписатьСтроку(" // TODO: Реализуйте спец. логику удаления, если требуется"); - ЗаписьТекста.ЗаписатьСтроку("КонецПроцедуры"); - - ЗаписьТекста.Закрыть(); - + КонецПроцедуры -Процедура ЗаписатьЗаготовкуСкриптаСборки(Знач Каталог) +Процедура ЗаписатьЗаготовкуСкриптаСборки(Знач ЗаписьТекста) - Лог.Информация("Создаю заготовку скрипта сборки"); + Лог.Информация("Создаю заготовку процедур сборки"); - ИмяФайла = ОбъединитьПути(Каталог, КонстантыOpm.ИмяФайлаСкриптаСборки); - ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла); ЗаписьТекста.ЗаписатьСтроку("///////////////////////////////////////////////////////////////////"); - ЗаписьТекста.ЗаписатьСтроку("// Сценарий сборки пакета "); + ЗаписьТекста.ЗаписатьСтроку("// Процедуры сборки пакета "); ЗаписьТекста.ЗаписатьСтроку("/////////////////////////////////////////////////////////////////// | |"); @@ -369,8 +314,7 @@ ЗаписьТекста.ЗаписатьСтроку("Процедура ПослеСборки(Знач РабочийКаталог, Знач ПутьКФайлуПакета) Экспорт"); ЗаписьТекста.ЗаписатьСтроку(" // TODO: Реализуйте спец. логику сборки, если требуется"); ЗаписьТекста.ЗаписатьСтроку("КонецПроцедуры"); - - ЗаписьТекста.Закрыть(); + ЗаписьТекста.ЗаписатьСтроку(Символы.ПС); КонецПроцедуры @@ -384,23 +328,50 @@ ЗаписьТекста.ЗаписатьСтроку("// Описание пакета для сборки и установки"); ЗаписьТекста.ЗаписатьСтроку("// Полную документацию см. на hub.oscript.io/packaging"); ЗаписьТекста.ЗаписатьСтроку("//"); - + ЗаписьТекста.ЗаписатьСтроку(""); + + Консоль = Новый Консоль; + ДобавлятьПроцедурыПереопределения = Неопределено; + Лог.Информация("Добавить в описание пакета процедуры переопределения сборки и установки?"); + Пока Истина Цикл + Лог.Информация("(y/n)"); + Значение = Консоль.ПрочитатьСтроку(); + Если ВРег(Значение) = "Y" Тогда + ДобавлятьПроцедурыПереопределения = Истина; + Прервать; + ИначеЕсли ВРег(Значение) = "N" Тогда + ДобавлятьПроцедурыПереопределения = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ДобавлятьПроцедурыПереопределения Тогда + ЗаписатьЗаготовкуСкриптаУстановки(ЗаписьТекста); + ЗаписатьЗаготовкуСкриптаСборки(ЗаписьТекста); + КонецЕсли; + ЗаписьТекста.ЗаписатьСтроку(" - | Описание.Имя("""+ИмяПакета+""") - | .Версия(""1.0.1"") - | .Автор("""") - | .АдресАвтора(""author@somemail.com"") - | .Описание(""Это очень хороший и нужный пакет программ"") - | .ВерсияСреды(""1.0.11"") - | .ВключитьФайл(""src"") - | .ВключитьФайл(""doc"") - | .ВключитьФайл(""tests"") - | .ВключитьФайл("""+КонстантыOpm.ИмяФайлаСкриптаУстановки+""") - | //.ЗависитОт(""package1"", "">=2.0"") - | //.ЗависитОт(""package2"", "">=1.1"", ""<2.0"") - | //.ОпределяетКласс(""УправлениеВселенной"", ""src/universe-mngr.os"") - | //.ОпределяетМодуль(""ПолезныеФункции"", ""src/tools.os"") - | ;"); + |Описание.Имя(""" + ИмяПакета + """) + | .Версия(""1.0.1"") + | .Автор("""") + | .АдресАвтора(""author@somemail.com"") + | .Описание(""Это очень хороший и нужный пакет программ"") + | .ВерсияСреды(""1.0.11"") + | .ВключитьФайл(""src"") + | .ВключитьФайл(""doc"") + | .ВключитьФайл(""tests"")"); + + Если ДобавлятьПроцедурыПереопределения Тогда + ЗаписьТекста.ЗаписатьСтроку( + " .ВключитьФайл(""" + КонстантыOpm.ИмяФайлаСпецификацииПакета + """)"); + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку( + " //.ЗависитОт(""package1"", "">=2.0"") + | //.ЗависитОт(""package2"", "">=1.1"", ""<2.0"") + | //.ОпределяетКласс(""УправлениеВселенной"", ""src/universe-mngr.os"") + | //.ОпределяетМодуль(""ПолезныеФункции"", ""src/tools.os"") + | ;"); ЗаписьТекста.Закрыть(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" index 6d558ff..f100a41 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" @@ -365,31 +365,14 @@ ЧтениеСодержимого = Новый ЧтениеZipФайла(ФайлСодержимого); Попытка - ИмяСкриптаУстановки = КонстантыOpm.ИмяФайлаСкриптаУстановки; - ЭлементСкриптаУстановки = ЧтениеСодержимого.Элементы.Найти(ИмяСкриптаУстановки); - Если ЭлементСкриптаУстановки <> Неопределено Тогда - Лог.Отладка("Найден скрипт установки пакета"); - - ЧтениеСодержимого.Извлечь(ЭлементСкриптаУстановки, мВременныйКаталогУстановки, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); - Лог.Отладка("Компиляция скрипта установки пакета"); - ОбъектСкрипта = ЗагрузитьСценарий(ОбъединитьПути(мВременныйКаталогУстановки, ИмяСкриптаУстановки)); - - ВызватьСобытиеПередУстановкой(ОбъектСкрипта, ЧтениеСодержимого, ПутьУстановки.ПолноеИмя, СтандартнаяОбработка); - - Если СтандартнаяОбработка Тогда - - Лог.Отладка("Устанавливаю файлы пакета из архива"); - УдалитьУстаревшиеФайлы(ПутьУстановки); - ЧтениеСодержимого.ИзвлечьВсе(ПутьУстановки.ПолноеИмя); - - ВызватьСобытиеПриУстановке(ОбъектСкрипта, ПутьУстановки.ПолноеИмя, СтандартнаяОбработка); - - КонецЕсли; - Иначе - Лог.Отладка("Устанавливаю файлы пакета из архива"); - УдалитьУстаревшиеФайлы(ПутьУстановки); - ЧтениеСодержимого.ИзвлечьВсе(ПутьУстановки.ПолноеИмя); - КонецЕсли; + + Лог.Отладка("Устанавливаю файлы пакета из архива"); + УдалитьУстаревшиеФайлы(ПутьУстановки); + ЧтениеСодержимого.ИзвлечьВсе(ПутьУстановки.ПолноеИмя); + + ОбработчикСобытий = ПолучитьОбработчикСобытий(ПутьУстановки.ПолноеИмя); + ВызватьСобытиеПриУстановке(ОбработчикСобытий, ПутьУстановки.ПолноеИмя, СтандартнаяОбработка); + Исключение ЧтениеСодержимого.Закрыть(); ВызватьИсключение; @@ -411,14 +394,34 @@ КонецЦикла; КонецПроцедуры -Процедура ВызватьСобытиеПередУстановкой(Знач ОбъектСкрипта, Знач АрхивПакета, Знач Каталог, СтандартнаяОбработка) - Лог.Отладка("Вызываю событие ПередУстановкой"); - ОбъектСкрипта.ПередУстановкой(АрхивПакета, Каталог, СтандартнаяОбработка); -КонецПроцедуры +Функция ПолучитьОбработчикСобытий(Знач ПутьУстановки) + ОбработчикСобытий = Неопределено; + ИмяФайлаСпецификацииПакета = КонстантыOpm.ИмяФайлаСпецификацииПакета; + ПутьКФайлуСпецификации = ОбъединитьПути(ПутьУстановки, ИмяФайлаСпецификацииПакета); + Если ФС.ФайлСуществует(ПутьКФайлуСпецификации) Тогда + Лог.Отладка("Найден файл спецификации пакета"); + Лог.Отладка("Компиляция файла спецификации пакета"); + + ОписаниеПакета = Новый ОписаниеПакета(); + ВнешнийКонтекст = Новый Структура("Описание", ОписаниеПакета); + ОбработчикСобытий = ЗагрузитьСценарий(ПутьКФайлуСпецификации, ВнешнийКонтекст); + КонецЕсли; + + Возврат ОбработчикСобытий; +КонецФункции + +Процедура ВызватьСобытиеПриУстановке(Знач ОбработчикСобытий, Знач Каталог, СтандартнаяОбработка) + + Если ОбработчикСобытий = Неопределено Тогда + Возврат; + КонецЕсли; + + Рефлектор = Новый Рефлектор; + Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПриУстановке") Тогда + Лог.Отладка("Вызываю событие ПриУстановке"); + ОбработчикСобытий.ПриУстановке(Каталог, СтандартнаяОбработка); + КонецЕсли; -Процедура ВызватьСобытиеПриУстановке(Знач ОбъектСкрипта, Знач Каталог, СтандартнаяОбработка) - Лог.Отладка("Вызываю событие ПриУстановке"); - ОбъектСкрипта.ПриУстановке(Каталог, СтандартнаяОбработка); КонецПроцедуры Процедура СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(Знач КаталогУстановки, Знач ОписаниеПакета) diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" index 4a62230..0757a18 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" @@ -1,7 +1,5 @@  Перем ИмяФайлаСпецификацииПакета Экспорт; -Перем ИмяФайлаСкриптаУстановки Экспорт; -Перем ИмяФайлаСкриптаСборки Экспорт; Перем ИмяФайлаСодержимогоПакета Экспорт; Перем ИмяФайлаМетаданныхПакета Экспорт; Перем СерверУдаленногоХранилища Экспорт; @@ -16,8 +14,6 @@ /////////////////////////////////////////////////////////////// ИмяФайлаСпецификацииПакета = "packagedef"; -ИмяФайлаСкриптаУстановки = "_install_.os"; -ИмяФайлаСкриптаСборки = "_build_.os"; ИмяФайлаСодержимогоПакета = "content.zip"; ИмяФайлаМетаданныхПакета = "opm-metadata.xml"; СерверУдаленногоХранилища = "http://hub.oscript.io";