Skip to content

Commit 8525c55

Browse files
committed
Если при установке пакета и компиляции файла packagedef возникает ошибка поиска файлов, тогда
Исправил неверный поиск файлов внутри архива #813 Исправил внесенную ошибку очистки каталога пакета Устранил давно возникшую путаницу в одинаковых именах объектов разных типов, из-за чего и была пропущена ошибка добавил диагностических отладочных сообщений рефакторинг имен параметров
1 parent 57e4453 commit 8525c55

File tree

1 file changed

+121
-78
lines changed

1 file changed

+121
-78
lines changed

src/core/Классы/УстановкаПакета.os

Lines changed: 121 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -13,60 +13,65 @@
1313
Перем Метаданные;
1414

1515
Процедура УстановитьПакетИзАрхива(Знач ФайлАрхива) Экспорт
16-
16+
1717
Лог.Отладка("Устанавливаю пакет из архива: " + ФайлАрхива);
1818
Если мЗависимостиВРаботе = Неопределено Тогда
1919
мЗависимостиВРаботе = Новый Соответствие;
2020
КонецЕсли;
21-
21+
2222
мВременныйКаталогУстановки = ВременныеФайлы.СоздатьКаталог();
2323
Лог.Отладка("Временный каталог установки: " + мВременныйКаталогУстановки);
24-
24+
25+
ПутьУстановки = "";
2526
Попытка
26-
27+
2728
Лог.Отладка("Открываем архив пакета");
2829
ЧтениеПакета = Новый ЧтениеZipФайла;
2930
ЧтениеПакета.Открыть(ФайлАрхива);
30-
31+
3132
ФайлСодержимого = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаСодержимогоПакета);
3233
ФайлМетаданных = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаМетаданныхПакета);
33-
34+
3435
Метаданные = ПрочитатьМетаданныеПакета(ФайлМетаданных);
3536
ИмяПакета = Метаданные.Свойства().Имя;
36-
37-
ПутьУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета);
38-
37+
38+
ОбъектКаталогУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета);
39+
ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя;
40+
3941
Лог.Информация("Устанавливаю пакет " + ИмяПакета);
4042
ПроверитьВерсиюСреды(Метаданные);
4143
Если мЗависимостиВРаботе[ИмяПакета] = "ВРаботе" Тогда
4244
ВызватьИсключение "Циклическая зависимость по пакету " + ИмяПакета;
4345
КонецЕсли;
44-
46+
4547
мЗависимостиВРаботе.Вставить(ИмяПакета, "ВРаботе");
46-
48+
4749
СтандартнаяОбработка = Истина;
48-
УстановитьФайлыПакета(ПутьУстановки, ФайлСодержимого, СтандартнаяОбработка);
50+
УстановитьФайлыПакета(ОбъектКаталогУстановки, ФайлСодержимого, СтандартнаяОбработка);
4951
Если СтандартнаяОбработка Тогда
50-
СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки.ПолноеИмя, Метаданные);
51-
РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки.ПолноеИмя, Метаданные, мРежимУстановкиПакетов);
52+
СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки, Метаданные);
53+
РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки, Метаданные, мРежимУстановкиПакетов);
5254
КонецЕсли;
53-
СохранитьФайлМетаданныхПакета(ПутьУстановки.ПолноеИмя, ФайлМетаданных);
54-
55+
СохранитьФайлМетаданныхПакета(ПутьУстановки, ФайлМетаданных);
56+
5557
ЧтениеПакета.Закрыть();
56-
58+
5759
ВременныеФайлы.УдалитьФайл(мВременныйКаталогУстановки);
58-
60+
5961
мЗависимостиВРаботе.Вставить(ИмяПакета, "Установлен");
60-
62+
6163
Исключение
62-
УдалитьКаталогУстановкиПриОшибке(ПутьУстановки);
64+
Лог.Предупреждение("Обрабатываю возникшую ошибку...");
65+
Если ЗначениеЗаполнено(ПутьУстановки) Тогда
66+
УдалитьКаталогУстановкиПриОшибке(ПутьУстановки);
67+
КонецЕсли;
6368
ЧтениеПакета.Закрыть();
6469
ВременныеФайлы.УдалитьФайл(мВременныйКаталогУстановки);
6570
ВызватьИсключение;
6671
КонецПопытки;
67-
72+
6873
Лог.Информация("Установка завершена");
69-
74+
7075
КонецПроцедуры
7176

7277
Процедура УстановитьКешПакетов(КэшПакетовВУстановке) Экспорт
@@ -82,12 +87,12 @@
8287
КонецПроцедуры
8388

8489
Процедура ПроверитьВерсиюСреды(Манифест)
85-
90+
8691
Свойства = Манифест.Свойства();
8792
Если НЕ Свойства.Свойство("ВерсияСреды") Тогда
8893
Возврат;
8994
КонецЕсли;
90-
95+
9196
ИмяПакета = Свойства.Имя;
9297
ТребуемаяВерсияСреды = Свойства.ВерсияСреды;
9398
СистемнаяИнформация = Новый СистемнаяИнформация;
@@ -98,12 +103,12 @@
98103
"Ошибка установки пакета <%1>: Обнаружена устаревшая версия движка OneScript.
99104
|Требуемая версия: %2
100105
|Текущая версия: %3
101-
|Обновите OneScript перед установкой пакета",
106+
|Обновите OneScript перед установкой пакета",
102107
ИмяПакета,
103108
ТребуемаяВерсияСреды,
104109
ВерсияСреды
105110
);
106-
111+
107112
ВызватьИсключение ТекстСообщения;
108113
КонецЕсли;
109114

@@ -116,54 +121,72 @@
116121
КонецПроцедуры
117122

118123
Функция НайтиСоздатьКаталогУстановки(Знач ИдентификаторПакета)
119-
120-
ПутьУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета));
121-
Лог.Отладка("Путь установки пакета: " + ПутьУстановки.ПолноеИмя);
122-
123-
Если Не ПутьУстановки.Существует() Тогда
124-
СоздатьКаталог(ПутьУстановки.ПолноеИмя);
125-
ИначеЕсли ПутьУстановки.ЭтоФайл() Тогда
126-
ВызватьИсключение "Не удалось создать каталог " + ПутьУстановки.ПолноеИмя;
124+
125+
ОбъектКаталогУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета));
126+
ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя;
127+
Лог.Отладка("Путь установки пакета: " + ПутьУстановки);
128+
129+
Если Не ОбъектКаталогУстановки.Существует() Тогда
130+
СоздатьКаталог(ПутьУстановки);
131+
ИначеЕсли ОбъектКаталогУстановки.ЭтоФайл() Тогда
132+
ВызватьИсключение "Не удалось создать каталог " + ПутьУстановки;
127133
КонецЕсли;
128-
129-
Возврат ПутьУстановки;
130-
134+
135+
Возврат ОбъектКаталогУстановки;
136+
131137
КонецФункции
132138

133-
Процедура УстановитьФайлыПакета(Знач ПутьУстановки, Знач ФайлСодержимого, СтандартнаяОбработка)
134-
139+
Процедура УстановитьФайлыПакета(Знач ОбъектКаталогУстановки, Знач ФайлСодержимого, СтандартнаяОбработка)
140+
135141
ЧтениеСодержимого = Новый ЧтениеZipФайла(ФайлСодержимого);
136-
КаталогУстановки = ПутьУстановки.ПолноеИмя;
142+
КаталогУстановки = ОбъектКаталогУстановки.ПолноеИмя;
143+
144+
Попытка
137145

138-
Попытка
139-
140146
Лог.Отладка("Устанавливаю файлы пакета из архива");
141-
УдалитьУстаревшиеФайлы(ПутьУстановки);
147+
УдалитьУстаревшиеФайлы(ОбъектКаталогУстановки);
142148

143149
ИзвлечьФайл(ЧтениеСодержимого, КонстантыOpm.ИмяФайлаСпецификацииПакета, КаталогУстановки);
144150

145-
ОбработчикСобытий = ПолучитьОбработчикСобытий(КаталогУстановки);
151+
Попытка
152+
ОбработчикСобытий = ПолучитьОбработчикСобытий(КаталогУстановки);
153+
Исключение
154+
ОписаниеОшибки = ОписаниеОшибки();
155+
Если Найти(ОписаниеОшибки, "System.IO.FileNotFoundException") <> 0 Тогда
156+
ОбработчикСобытий = Неопределено;
157+
Иначе
158+
ВызватьИсключение;
159+
КонецЕсли;
160+
КонецПопытки;
161+
ПолученОбработчикСобытий = ОбработчикСобытий <> Неопределено;
146162

147-
ВызватьСобытиеПередУстановкой(ОбработчикСобытий, КаталогУстановки, ЧтениеСодержимого);
163+
Если ПолученОбработчикСобытий Тогда
164+
ВызватьСобытиеПередУстановкой(ОбработчикСобытий, КаталогУстановки, ЧтениеСодержимого);
165+
КонецЕсли;
148166

149167
ЧтениеСодержимого.ИзвлечьВсе(КаталогУстановки);
150-
168+
169+
Если Не ПолученОбработчикСобытий Тогда
170+
ОбработчикСобытий = ПолучитьОбработчикСобытий(КаталогУстановки);
171+
КонецЕсли;
172+
151173
ВызватьСобытиеПриУстановке(ОбработчикСобытий, КаталогУстановки, СтандартнаяОбработка);
152-
174+
153175
Исключение
154176
ЧтениеСодержимого.Закрыть();
155177
ВызватьИсключение;
156178
КонецПопытки;
157-
179+
158180
ЧтениеСодержимого.Закрыть();
159-
181+
160182
КонецПроцедуры
161183

162-
Процедура УдалитьУстаревшиеФайлы(Знач ПутьУстановки)
184+
Процедура УдалитьУстаревшиеФайлы(Знач ОбъектКаталогУстановки)
163185
Лог.Отладка("Удаляю устаревшие файлы");
164-
УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "*.os", Истина);
165-
УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "*.dll", Истина);
166-
УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "packagedef", Ложь);
186+
ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя;
187+
УдалитьФайлыВКаталоге(ПутьУстановки, "*.os", Истина);
188+
УдалитьФайлыВКаталоге(ПутьУстановки, "*.dll", Истина);
189+
УдалитьФайлыВКаталоге(ПутьУстановки, "packagedef", Ложь);
167190
КонецПроцедуры
168191

169192
Процедура УдалитьФайлыВКаталоге(Знач ПутьКаталога, Знач МаскаФайлов, Знач ИскатьВПодкаталогах = Истина)
@@ -180,7 +203,7 @@
180203
Если ФС.ФайлСуществует(ПутьКФайлуСпецификации) Тогда
181204
Лог.Отладка("Найден файл спецификации пакета");
182205
Лог.Отладка("Компиляция файла спецификации пакета");
183-
206+
184207
ОписаниеПакета = Новый ОписаниеПакета();
185208
ВнешнийКонтекст = Новый Структура("Описание", ОписаниеПакета);
186209
ОбработчикСобытий = ЗагрузитьСценарий(ПутьКФайлуСпецификации, ВнешнийКонтекст);
@@ -218,21 +241,21 @@
218241
КонецПроцедуры
219242

220243
Процедура СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(Знач КаталогУстановки, Знач ОписаниеПакета)
221-
244+
222245
ИмяПакета = ОписаниеПакета.Свойства().Имя;
223-
246+
224247
Для Каждого ФайлПриложения Из ОписаниеПакета.ИсполняемыеФайлы() Цикл
225-
248+
226249
ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения);
227250
Лог.Информация("Регистрация приложения: " + ИмяСкриптаЗапуска);
228-
251+
229252
ОбъектФайл = Новый Файл(ОбъединитьПути(КаталогУстановки, ФайлПриложения.Путь));
230-
253+
231254
Если Не ОбъектФайл.Существует() Тогда
232255
Лог.Ошибка("Файл приложения " + ОбъектФайл.ПолноеИмя + " не существует");
233256
ВызватьИсключение "Некорректные данные в метаданных пакета";
234257
КонецЕсли;
235-
258+
236259
Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда
237260
КаталогУстановкиСкриптовЗапускаПриложений = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin");
238261
ФС.ОбеспечитьКаталог(КаталогУстановкиСкриптовЗапускаПриложений);
@@ -245,11 +268,11 @@
245268
Иначе
246269
ВызватьИсключение "Неизвестный режим установки пакетов <" + мРежимУстановкиПакетов + ">";
247270
КонецЕсли;
248-
271+
249272
СоздатьСкриптЗапуска(ИмяСкриптаЗапуска, ОбъектФайл.ПолноеИмя, КаталогУстановкиСкриптовЗапускаПриложений);
250-
273+
251274
КонецЦикла;
252-
275+
253276
КонецПроцедуры
254277

255278
Процедура СоздатьСкриптЗапуска(Знач ИмяСкриптаЗапуска, Знач ПутьФайлаПриложения, Знач Каталог) Экспорт
@@ -281,7 +304,7 @@
281304
КонецПроцедуры
282305

283306
Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных)
284-
307+
285308
Перем Метаданные;
286309
Лог.Отладка("Чтение метаданных пакета");
287310
Попытка
@@ -290,24 +313,24 @@
290313
Лог.Отладка("XML загружен");
291314
Сериализатор = Новый СериализацияМетаданныхПакета;
292315
Метаданные = Сериализатор.ПрочитатьXML(Чтение);
293-
316+
294317
Чтение.Закрыть();
295318
Исключение
296319
Чтение.Закрыть();
297320
ВызватьИсключение;
298321
КонецПопытки;
299322
Лог.Отладка("Метаданные прочитаны");
300-
323+
301324
Возврат Метаданные;
302-
325+
303326
КонецФункции
304327

305-
Процедура СохранитьФайлМетаданныхПакета(Знач КаталогУстановки, Знач ПутьКФайлуМетаданных)
306-
307-
ПутьСохранения = ОбъединитьПути(КаталогУстановки, КонстантыOpm.ИмяФайлаМетаданныхПакета);
328+
Процедура СохранитьФайлМетаданныхПакета(Знач ПутьУстановки, Знач ПутьКФайлуМетаданных)
329+
330+
ПутьСохранения = ОбъединитьПути(ПутьУстановки, КонстантыOpm.ИмяФайлаМетаданныхПакета);
308331
ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлуМетаданных);
309332
ДанныеФайла.Записать(ПутьСохранения);
310-
333+
311334
КонецПроцедуры
312335

313336
Процедура УдалитьКаталогУстановкиПриОшибке(Знач Каталог)
@@ -324,28 +347,48 @@
324347
//
325348

326349
Функция ИзвлечьОбязательныйФайл(Знач Чтение, Знач ИмяФайла)
327-
350+
328351
ПутьФайла = ИзвлечьФайл(Чтение, ИмяФайла, мВременныйКаталогУстановки);
329352
Если ПутьФайла = "" Тогда
330353
ВызватьИсключение "Неверная структура пакета. Не найден файл " + ИмяФайла;
331354
КонецЕсли;
332-
355+
333356
Возврат ПутьФайла;
334-
357+
335358
КонецФункции
336359

337360
Функция ИзвлечьФайл(Знач Чтение, Знач ИмяФайла, Знач КаталогКудаИзвлечь)
338361
Лог.Отладка("Извлечение: %1", ИмяФайла);
339-
Элемент = Чтение.Элементы.Найти(ИмяФайла);
362+
Лог.Отладка("Извлечение: КаталогКудаИзвлечь %1", КаталогКудаИзвлечь);
363+
364+
Элемент = НайтиЭлементАрхива(Чтение, ИмяФайла);
340365
Если Элемент = Неопределено Тогда
341366
Лог.Отладка("Не удалось извлечь файл %1", ИмяФайла);
342367
Возврат "";
343368
КонецЕсли;
344-
369+
345370
Чтение.Извлечь(Элемент, КаталогКудаИзвлечь);
346-
371+
347372
Возврат ОбъединитьПути(мВременныйКаталогУстановки, ИмяФайла);
348-
373+
374+
КонецФункции
375+
376+
Функция НайтиЭлементАрхива(Знач Чтение, Знач ПолноеИмя)
377+
Лог.Отладка("НайтиЭлементАрхива: ищем в архиве файл %1", ПолноеИмя);
378+
Файл = Новый Файл(ПолноеИмя);
379+
Если Лев(Файл.Путь, 2) = ".\" Или Лев(Файл.Путь, 2) = "./" Тогда
380+
ПолноеИмя = Файл.Имя;
381+
КонецЕсли;
382+
Для Каждого Элемент Из Чтение.Элементы Цикл
383+
384+
Если НРег(Элемент.ПолноеИмя) = НРег(ПолноеИмя) Тогда
385+
Лог.Отладка("НайтиЭлементАрхива: нашли Элемент.ПолноеИмя %1", Элемент.ПолноеИмя);
386+
387+
Возврат Элемент;
388+
КонецЕсли;
389+
КонецЦикла;
390+
Лог.Отладка("НайтиЭлементАрхива: не нашли элемент");
391+
Возврат Неопределено;
349392
КонецФункции
350393

351394
Лог = Логирование.ПолучитьЛог("oscript.app.opm");

0 commit comments

Comments
 (0)