Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 62 additions & 91 deletions src/Классы/СборщикПакета.os
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
Перем Лог;
Перем РабочийКаталог;
Перем ВремКаталогСборки;
Перем ОбработчикСобытийСборки;
Перем ОбработчикСобытий;

//////////////////////////////////////////////////////////
// Сборка пакета
Expand All @@ -35,9 +35,8 @@
Лог.Информация("Начинаю сборку в каталоге " + РабочийКаталог);
УстановитьТекущийКаталог(РабочийКаталог);
УточнитьФайлМанифеста(ФайлМанифеста);
ИнициализироватьОбработчикСобытийСборки();
ВызватьСобытиеПередСборкой();
Манифест = ПрочитатьМанифест(ФайлМанифеста);
ВызватьСобытиеПередСборкой();
СобратьПакетВКаталогеСборки(Манифест, ВыходнойКаталог);
УстановитьТекущийКаталог(ТекущийРабКаталог);
Лог.Информация("Сборка пакета завершена");
Expand Down Expand Up @@ -70,25 +69,12 @@

КонецПроцедуры

Процедура ИнициализироватьОбработчикСобытийСборки()
ОбработчикСобытийСборки = Неопределено;
ИмяСкриптаСборки = КонстантыOpm.ИмяФайлаСкриптаСборки;

ПутьКФайлуСборки = ОбъединитьПути(ТекущийКаталог(), ИмяСкриптаСборки);
Если НЕ ФС.ФайлСуществует(ПутьКФайлуСборки) Тогда
Возврат;
КонецЕсли;

Лог.Отладка("Найден скрипт сборки пакета");
ОбработчикСобытийСборки = ЗагрузитьСценарий(ПутьКФайлуСборки);
КонецПроцедуры

Функция ПрочитатьМанифест(Знач ФайлМанифеста)

ОписаниеПакета = Новый ОписаниеПакета();
Лог.Информация("Загружаю описание пакета...");
ВнешнийКонтекст = Новый Структура("Описание", ОписаниеПакета);
Манифест = ЗагрузитьСценарий(ФайлМанифеста, ВнешнийКонтекст);
ОбработчикСобытий = ЗагрузитьСценарий(ФайлМанифеста, ВнешнийКонтекст);
Лог.Информация("Описание пакета прочитано");

Возврат ОписаниеПакета;
Expand Down Expand Up @@ -116,7 +102,7 @@

КонецПроцедуры

Процедура ДобавитьОписаниеМетаданныхПакета(Знач Архив, Знач Манифест);
Процедура ДобавитьОписаниеМетаданныхПакета(Знач Архив, Знач Манифест)

ПутьМанифеста = ОбъединитьПути(ВремКаталогСборки, "opm-metadata.xml");
Запись = Новый ЗаписьXML;
Expand Down Expand Up @@ -202,38 +188,26 @@
КонецПроцедуры

Процедура ВызватьСобытиеПередСборкой()
Если ОбработчикСобытийСборки = Неопределено Тогда
Возврат;
КонецЕсли;

Рефлектор = Новый Рефлектор;
Если Рефлектор.МетодСуществует(ОбработчикСобытийСборки, "ПередСборкой") Тогда
Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПередСборкой") Тогда
Лог.Отладка("Вызываю событие ПередСборкой");
ОбработчикСобытийСборки.ПередСборкой(РабочийКаталог);
ОбработчикСобытий.ПередСборкой(РабочийКаталог);
КонецЕсли;
КонецПроцедуры

Процедура ВызватьСобытиеПриСборке(АрхивПакета)
Если ОбработчикСобытийСборки = Неопределено Тогда
Возврат;
КонецЕсли;

Рефлектор = Новый Рефлектор;
Если Рефлектор.МетодСуществует(ОбработчикСобытийСборки, "ПриСборке") Тогда
Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПриСборке") Тогда
Лог.Отладка("Вызываю событие ПриСборке");
ОбработчикСобытийСборки.ПриСборке(РабочийКаталог, АрхивПакета);
ОбработчикСобытий.ПриСборке(РабочийКаталог, АрхивПакета);
КонецЕсли;
КонецПроцедуры

Процедура ВызватьСобытиеПослеСборки(ПутьКФайлуПакета)
Если ОбработчикСобытийСборки = Неопределено Тогда
Возврат;
КонецЕсли;

Рефлектор = Новый Рефлектор;
Если Рефлектор.МетодСуществует(ОбработчикСобытийСборки, "ПослеСборки") Тогда
Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПослеСборки") Тогда
Лог.Отладка("Вызываю событие ПослеСборки");
ОбработчикСобытийСборки.ПослеСборки(РабочийКаталог, ПутьКФайлуПакета);
ОбработчикСобытий.ПослеСборки(РабочийКаталог, ПутьКФайлуПакета);
КонецЕсли;
КонецПроцедуры

Expand Down Expand Up @@ -264,9 +238,6 @@
СоздатьПодкаталог(ВыходнойКаталог.ПолноеИмя, "tests");
СоздатьПодкаталог(ВыходнойКаталог.ПолноеИмя, "docs");

ЗаписатьЗаготовкуСкриптаУстановки(ВыходнойКаталог.ПолноеИмя);
ЗаписатьЗаготовкуСкриптаСборки(ВыходнойКаталог.ПолноеИмя);

ЗаписатьЗаготовкуМанифестаБиблиотеки(ВыходнойКаталог.ПолноеИмя, ИмяПакета);

Лог.Информация("Готово");
Expand All @@ -278,29 +249,16 @@
СоздатьКаталог(ОбъединитьПути(База, Имя));
КонецПроцедуры

Процедура ЗаписатьЗаготовкуСкриптаУстановки(Знач Каталог)
Процедура ЗаписатьЗаготовкуСкриптаУстановки(ЗаписьТекста)

Лог.Информация("Создаю заготовку скрипта установки/удаления");
Лог.Информация("Создаю процедур установки/удаления");

ИмяФайла = ОбъединитьПути(Каталог, КонстантыOpm.ИмяФайлаСкриптаУстановки);
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
ЗаписьТекста.ЗаписатьСтроку("///////////////////////////////////////////////////////////////////");
ЗаписьТекста.ЗаписатьСтроку("// Сценарий установки и удаления пакета с клиентской машины ");
ЗаписьТекста.ЗаписатьСтроку("// Процедуры установки пакета с клиентской машины ");
ЗаписьТекста.ЗаписатьСтроку("///////////////////////////////////////////////////////////////////
|
|");

ЗаписьТекста.ЗаписатьСтроку("// Вызывается пакетным менеджером перед установкой пакета на клиентскую машину.");
ЗаписьТекста.ЗаписатьСтроку("// ");
ЗаписьТекста.ЗаписатьСтроку("// Параметры:");
ЗаписьТекста.ЗаписатьСтроку("// АрхивПакета - ЧтениеZipФайла. Открытый архив пакета.");
ЗаписьТекста.ЗаписатьСтроку("// КаталогУстановкиПакета - строка. Путь в который пакетный менеджер устанавливает текущий пакет.");
ЗаписьТекста.ЗаписатьСтроку("// ");
ЗаписьТекста.ЗаписатьСтроку("Процедура ПередУстановкой(Знач АрхивПакета, Знач КаталогУстановкиПакета, СтандартнаяОбработка) Экспорт");
ЗаписьТекста.ЗаписатьСтроку(" // TODO: Реализуйте спец. логику установки, если требуется");
ЗаписьТекста.ЗаписатьСтроку("КонецПроцедуры");
ЗаписьТекста.ЗаписатьСтроку(Символы.ПС);


ЗаписьТекста.ЗаписатьСтроку("// Вызывается пакетным менеджером после распаковки пакета на клиентскую машину.");
ЗаписьТекста.ЗаписатьСтроку("// ");
ЗаписьТекста.ЗаписатьСтроку("// Параметры:");
Expand All @@ -310,28 +268,15 @@
ЗаписьТекста.ЗаписатьСтроку(" // TODO: Реализуйте спец. логику установки, если требуется");
ЗаписьТекста.ЗаписатьСтроку("КонецПроцедуры");
ЗаписьТекста.ЗаписатьСтроку(Символы.ПС);

ЗаписьТекста.ЗаписатьСтроку("// Вызывается пакетным менеджером при удалении пакета с клиентской машины.");
ЗаписьТекста.ЗаписатьСтроку("// ");
ЗаписьТекста.ЗаписатьСтроку("// Параметры:");
ЗаписьТекста.ЗаписатьСтроку("// КаталогУстановкиПакета - строка. Каталог в который установлен пакет.");
ЗаписьТекста.ЗаписатьСтроку("// ");
ЗаписьТекста.ЗаписатьСтроку("Процедура ПриУдалении(Знач КаталогУстановкиПакета) Экспорт");
ЗаписьТекста.ЗаписатьСтроку(" // TODO: Реализуйте спец. логику удаления, если требуется");
ЗаписьТекста.ЗаписатьСтроку("КонецПроцедуры");

ЗаписьТекста.Закрыть();


КонецПроцедуры

Процедура ЗаписатьЗаготовкуСкриптаСборки(Знач Каталог)
Процедура ЗаписатьЗаготовкуСкриптаСборки(Знач ЗаписьТекста)

Лог.Информация("Создаю заготовку скрипта сборки");
Лог.Информация("Создаю заготовку процедур сборки");

ИмяФайла = ОбъединитьПути(Каталог, КонстантыOpm.ИмяФайлаСкриптаСборки);
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
ЗаписьТекста.ЗаписатьСтроку("///////////////////////////////////////////////////////////////////");
ЗаписьТекста.ЗаписатьСтроку("// Сценарий сборки пакета ");
ЗаписьТекста.ЗаписатьСтроку("// Процедуры сборки пакета ");
ЗаписьТекста.ЗаписатьСтроку("///////////////////////////////////////////////////////////////////
|
|");
Expand Down Expand Up @@ -369,8 +314,7 @@
ЗаписьТекста.ЗаписатьСтроку("Процедура ПослеСборки(Знач РабочийКаталог, Знач ПутьКФайлуПакета) Экспорт");
ЗаписьТекста.ЗаписатьСтроку(" // TODO: Реализуйте спец. логику сборки, если требуется");
ЗаписьТекста.ЗаписатьСтроку("КонецПроцедуры");

ЗаписьТекста.Закрыть();
ЗаписьТекста.ЗаписатьСтроку(Символы.ПС);

КонецПроцедуры

Expand All @@ -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"")
| ;");

ЗаписьТекста.Закрыть();

Expand Down
Loading