|
13 | 13 | Перем Метаданные; |
14 | 14 |
|
15 | 15 | Процедура УстановитьПакетИзАрхива(Знач ФайлАрхива) Экспорт |
16 | | - |
| 16 | + |
17 | 17 | Лог.Отладка("Устанавливаю пакет из архива: " + ФайлАрхива); |
18 | 18 | Если мЗависимостиВРаботе = Неопределено Тогда |
19 | 19 | мЗависимостиВРаботе = Новый Соответствие; |
20 | 20 | КонецЕсли; |
21 | | - |
| 21 | + |
22 | 22 | мВременныйКаталогУстановки = ВременныеФайлы.СоздатьКаталог(); |
23 | 23 | Лог.Отладка("Временный каталог установки: " + мВременныйКаталогУстановки); |
24 | | - |
| 24 | + |
| 25 | + ПутьУстановки = ""; |
25 | 26 | Попытка |
26 | | - |
| 27 | + |
27 | 28 | Лог.Отладка("Открываем архив пакета"); |
28 | 29 | ЧтениеПакета = Новый ЧтениеZipФайла; |
29 | 30 | ЧтениеПакета.Открыть(ФайлАрхива); |
30 | | - |
| 31 | + |
31 | 32 | ФайлСодержимого = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаСодержимогоПакета); |
32 | 33 | ФайлМетаданных = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаМетаданныхПакета); |
33 | | - |
| 34 | + |
34 | 35 | Метаданные = ПрочитатьМетаданныеПакета(ФайлМетаданных); |
35 | 36 | ИмяПакета = Метаданные.Свойства().Имя; |
36 | | - |
37 | | - ПутьУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета); |
38 | | - |
| 37 | + |
| 38 | + ОбъектКаталогУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета); |
| 39 | + ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя; |
| 40 | + |
39 | 41 | Лог.Информация("Устанавливаю пакет " + ИмяПакета); |
40 | 42 | ПроверитьВерсиюСреды(Метаданные); |
41 | 43 | Если мЗависимостиВРаботе[ИмяПакета] = "ВРаботе" Тогда |
42 | 44 | ВызватьИсключение "Циклическая зависимость по пакету " + ИмяПакета; |
43 | 45 | КонецЕсли; |
44 | | - |
| 46 | + |
45 | 47 | мЗависимостиВРаботе.Вставить(ИмяПакета, "ВРаботе"); |
46 | | - |
| 48 | + |
47 | 49 | СтандартнаяОбработка = Истина; |
48 | | - УстановитьФайлыПакета(ПутьУстановки, ФайлСодержимого, СтандартнаяОбработка); |
| 50 | + УстановитьФайлыПакета(ОбъектКаталогУстановки, ФайлСодержимого, СтандартнаяОбработка); |
49 | 51 | Если СтандартнаяОбработка Тогда |
50 | | - СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки.ПолноеИмя, Метаданные); |
51 | | - РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки.ПолноеИмя, Метаданные, мРежимУстановкиПакетов); |
| 52 | + СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки, Метаданные); |
| 53 | + РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки, Метаданные, мРежимУстановкиПакетов); |
52 | 54 | КонецЕсли; |
53 | | - СохранитьФайлМетаданныхПакета(ПутьУстановки.ПолноеИмя, ФайлМетаданных); |
54 | | - |
| 55 | + СохранитьФайлМетаданныхПакета(ПутьУстановки, ФайлМетаданных); |
| 56 | + |
55 | 57 | ЧтениеПакета.Закрыть(); |
56 | | - |
| 58 | + |
57 | 59 | ВременныеФайлы.УдалитьФайл(мВременныйКаталогУстановки); |
58 | | - |
| 60 | + |
59 | 61 | мЗависимостиВРаботе.Вставить(ИмяПакета, "Установлен"); |
60 | | - |
| 62 | + |
61 | 63 | Исключение |
62 | | - УдалитьКаталогУстановкиПриОшибке(ПутьУстановки); |
| 64 | + Лог.Предупреждение("Обрабатываю возникшую ошибку..."); |
| 65 | + Если ЗначениеЗаполнено(ПутьУстановки) Тогда |
| 66 | + УдалитьКаталогУстановкиПриОшибке(ПутьУстановки); |
| 67 | + КонецЕсли; |
63 | 68 | ЧтениеПакета.Закрыть(); |
64 | 69 | ВременныеФайлы.УдалитьФайл(мВременныйКаталогУстановки); |
65 | 70 | ВызватьИсключение; |
66 | 71 | КонецПопытки; |
67 | | - |
| 72 | + |
68 | 73 | Лог.Информация("Установка завершена"); |
69 | | - |
| 74 | + |
70 | 75 | КонецПроцедуры |
71 | 76 |
|
72 | 77 | Процедура УстановитьКешПакетов(КэшПакетовВУстановке) Экспорт |
|
82 | 87 | КонецПроцедуры |
83 | 88 |
|
84 | 89 | Процедура ПроверитьВерсиюСреды(Манифест) |
85 | | - |
| 90 | + |
86 | 91 | Свойства = Манифест.Свойства(); |
87 | 92 | Если НЕ Свойства.Свойство("ВерсияСреды") Тогда |
88 | 93 | Возврат; |
89 | 94 | КонецЕсли; |
90 | | - |
| 95 | + |
91 | 96 | ИмяПакета = Свойства.Имя; |
92 | 97 | ТребуемаяВерсияСреды = Свойства.ВерсияСреды; |
93 | 98 | СистемнаяИнформация = Новый СистемнаяИнформация; |
|
98 | 103 | "Ошибка установки пакета <%1>: Обнаружена устаревшая версия движка OneScript. |
99 | 104 | |Требуемая версия: %2 |
100 | 105 | |Текущая версия: %3 |
101 | | - |Обновите OneScript перед установкой пакета", |
| 106 | + |Обновите OneScript перед установкой пакета", |
102 | 107 | ИмяПакета, |
103 | 108 | ТребуемаяВерсияСреды, |
104 | 109 | ВерсияСреды |
105 | 110 | ); |
106 | | - |
| 111 | + |
107 | 112 | ВызватьИсключение ТекстСообщения; |
108 | 113 | КонецЕсли; |
109 | 114 |
|
|
116 | 121 | КонецПроцедуры |
117 | 122 |
|
118 | 123 | Функция НайтиСоздатьКаталогУстановки(Знач ИдентификаторПакета) |
119 | | - |
120 | | - ПутьУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета)); |
121 | | - Лог.Отладка("Путь установки пакета: " + ПутьУстановки.ПолноеИмя); |
122 | | - |
123 | | - Если Не ПутьУстановки.Существует() Тогда |
124 | | - СоздатьКаталог(ПутьУстановки.ПолноеИмя); |
125 | | - ИначеЕсли ПутьУстановки.ЭтоФайл() Тогда |
126 | | - ВызватьИсключение "Не удалось создать каталог " + ПутьУстановки.ПолноеИмя; |
| 124 | + |
| 125 | + ОбъектКаталогУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета)); |
| 126 | + ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя; |
| 127 | + Лог.Отладка("Путь установки пакета: " + ПутьУстановки); |
| 128 | + |
| 129 | + Если Не ОбъектКаталогУстановки.Существует() Тогда |
| 130 | + СоздатьКаталог(ПутьУстановки); |
| 131 | + ИначеЕсли ОбъектКаталогУстановки.ЭтоФайл() Тогда |
| 132 | + ВызватьИсключение "Не удалось создать каталог " + ПутьУстановки; |
127 | 133 | КонецЕсли; |
128 | | - |
129 | | - Возврат ПутьУстановки; |
130 | | - |
| 134 | + |
| 135 | + Возврат ОбъектКаталогУстановки; |
| 136 | + |
131 | 137 | КонецФункции |
132 | 138 |
|
133 | | -Процедура УстановитьФайлыПакета(Знач ПутьУстановки, Знач ФайлСодержимого, СтандартнаяОбработка) |
134 | | - |
| 139 | +Процедура УстановитьФайлыПакета(Знач ОбъектКаталогУстановки, Знач ФайлСодержимого, СтандартнаяОбработка) |
| 140 | + |
135 | 141 | ЧтениеСодержимого = Новый ЧтениеZipФайла(ФайлСодержимого); |
136 | | - КаталогУстановки = ПутьУстановки.ПолноеИмя; |
| 142 | + КаталогУстановки = ОбъектКаталогУстановки.ПолноеИмя; |
| 143 | + |
| 144 | + Попытка |
137 | 145 |
|
138 | | - Попытка |
139 | | - |
140 | 146 | Лог.Отладка("Устанавливаю файлы пакета из архива"); |
141 | | - УдалитьУстаревшиеФайлы(ПутьУстановки); |
| 147 | + УдалитьУстаревшиеФайлы(ОбъектКаталогУстановки); |
142 | 148 |
|
143 | 149 | ИзвлечьФайл(ЧтениеСодержимого, КонстантыOpm.ИмяФайлаСпецификацииПакета, КаталогУстановки); |
144 | 150 |
|
145 | | - ОбработчикСобытий = ПолучитьОбработчикСобытий(КаталогУстановки); |
| 151 | + Попытка |
| 152 | + ОбработчикСобытий = ПолучитьОбработчикСобытий(КаталогУстановки); |
| 153 | + Исключение |
| 154 | + ОписаниеОшибки = ОписаниеОшибки(); |
| 155 | + Если Найти(ОписаниеОшибки, "System.IO.FileNotFoundException") <> 0 Тогда |
| 156 | + ОбработчикСобытий = Неопределено; |
| 157 | + Иначе |
| 158 | + ВызватьИсключение; |
| 159 | + КонецЕсли; |
| 160 | + КонецПопытки; |
| 161 | + ПолученОбработчикСобытий = ОбработчикСобытий <> Неопределено; |
146 | 162 |
|
147 | | - ВызватьСобытиеПередУстановкой(ОбработчикСобытий, КаталогУстановки, ЧтениеСодержимого); |
| 163 | + Если ПолученОбработчикСобытий Тогда |
| 164 | + ВызватьСобытиеПередУстановкой(ОбработчикСобытий, КаталогУстановки, ЧтениеСодержимого); |
| 165 | + КонецЕсли; |
148 | 166 |
|
149 | 167 | ЧтениеСодержимого.ИзвлечьВсе(КаталогУстановки); |
150 | | - |
| 168 | + |
| 169 | + Если Не ПолученОбработчикСобытий Тогда |
| 170 | + ОбработчикСобытий = ПолучитьОбработчикСобытий(КаталогУстановки); |
| 171 | + КонецЕсли; |
| 172 | + |
151 | 173 | ВызватьСобытиеПриУстановке(ОбработчикСобытий, КаталогУстановки, СтандартнаяОбработка); |
152 | | - |
| 174 | + |
153 | 175 | Исключение |
154 | 176 | ЧтениеСодержимого.Закрыть(); |
155 | 177 | ВызватьИсключение; |
156 | 178 | КонецПопытки; |
157 | | - |
| 179 | + |
158 | 180 | ЧтениеСодержимого.Закрыть(); |
159 | | - |
| 181 | + |
160 | 182 | КонецПроцедуры |
161 | 183 |
|
162 | | -Процедура УдалитьУстаревшиеФайлы(Знач ПутьУстановки) |
| 184 | +Процедура УдалитьУстаревшиеФайлы(Знач ОбъектКаталогУстановки) |
163 | 185 | Лог.Отладка("Удаляю устаревшие файлы"); |
164 | | - УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "*.os", Истина); |
165 | | - УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "*.dll", Истина); |
166 | | - УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "packagedef", Ложь); |
| 186 | + ПутьУстановки = ОбъектКаталогУстановки.ПолноеИмя; |
| 187 | + УдалитьФайлыВКаталоге(ПутьУстановки, "*.os", Истина); |
| 188 | + УдалитьФайлыВКаталоге(ПутьУстановки, "*.dll", Истина); |
| 189 | + УдалитьФайлыВКаталоге(ПутьУстановки, "packagedef", Ложь); |
167 | 190 | КонецПроцедуры |
168 | 191 |
|
169 | 192 | Процедура УдалитьФайлыВКаталоге(Знач ПутьКаталога, Знач МаскаФайлов, Знач ИскатьВПодкаталогах = Истина) |
|
180 | 203 | Если ФС.ФайлСуществует(ПутьКФайлуСпецификации) Тогда |
181 | 204 | Лог.Отладка("Найден файл спецификации пакета"); |
182 | 205 | Лог.Отладка("Компиляция файла спецификации пакета"); |
183 | | - |
| 206 | + |
184 | 207 | ОписаниеПакета = Новый ОписаниеПакета(); |
185 | 208 | ВнешнийКонтекст = Новый Структура("Описание", ОписаниеПакета); |
186 | 209 | ОбработчикСобытий = ЗагрузитьСценарий(ПутьКФайлуСпецификации, ВнешнийКонтекст); |
|
218 | 241 | КонецПроцедуры |
219 | 242 |
|
220 | 243 | Процедура СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(Знач КаталогУстановки, Знач ОписаниеПакета) |
221 | | - |
| 244 | + |
222 | 245 | ИмяПакета = ОписаниеПакета.Свойства().Имя; |
223 | | - |
| 246 | + |
224 | 247 | Для Каждого ФайлПриложения Из ОписаниеПакета.ИсполняемыеФайлы() Цикл |
225 | | - |
| 248 | + |
226 | 249 | ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения); |
227 | 250 | Лог.Информация("Регистрация приложения: " + ИмяСкриптаЗапуска); |
228 | | - |
| 251 | + |
229 | 252 | ОбъектФайл = Новый Файл(ОбъединитьПути(КаталогУстановки, ФайлПриложения.Путь)); |
230 | | - |
| 253 | + |
231 | 254 | Если Не ОбъектФайл.Существует() Тогда |
232 | 255 | Лог.Ошибка("Файл приложения " + ОбъектФайл.ПолноеИмя + " не существует"); |
233 | 256 | ВызватьИсключение "Некорректные данные в метаданных пакета"; |
234 | 257 | КонецЕсли; |
235 | | - |
| 258 | + |
236 | 259 | Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда |
237 | 260 | КаталогУстановкиСкриптовЗапускаПриложений = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin"); |
238 | 261 | ФС.ОбеспечитьКаталог(КаталогУстановкиСкриптовЗапускаПриложений); |
|
245 | 268 | Иначе |
246 | 269 | ВызватьИсключение "Неизвестный режим установки пакетов <" + мРежимУстановкиПакетов + ">"; |
247 | 270 | КонецЕсли; |
248 | | - |
| 271 | + |
249 | 272 | СоздатьСкриптЗапуска(ИмяСкриптаЗапуска, ОбъектФайл.ПолноеИмя, КаталогУстановкиСкриптовЗапускаПриложений); |
250 | | - |
| 273 | + |
251 | 274 | КонецЦикла; |
252 | | - |
| 275 | + |
253 | 276 | КонецПроцедуры |
254 | 277 |
|
255 | 278 | Процедура СоздатьСкриптЗапуска(Знач ИмяСкриптаЗапуска, Знач ПутьФайлаПриложения, Знач Каталог) Экспорт |
|
281 | 304 | КонецПроцедуры |
282 | 305 |
|
283 | 306 | Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных) |
284 | | - |
| 307 | + |
285 | 308 | Перем Метаданные; |
286 | 309 | Лог.Отладка("Чтение метаданных пакета"); |
287 | 310 | Попытка |
|
290 | 313 | Лог.Отладка("XML загружен"); |
291 | 314 | Сериализатор = Новый СериализацияМетаданныхПакета; |
292 | 315 | Метаданные = Сериализатор.ПрочитатьXML(Чтение); |
293 | | - |
| 316 | + |
294 | 317 | Чтение.Закрыть(); |
295 | 318 | Исключение |
296 | 319 | Чтение.Закрыть(); |
297 | 320 | ВызватьИсключение; |
298 | 321 | КонецПопытки; |
299 | 322 | Лог.Отладка("Метаданные прочитаны"); |
300 | | - |
| 323 | + |
301 | 324 | Возврат Метаданные; |
302 | | - |
| 325 | + |
303 | 326 | КонецФункции |
304 | 327 |
|
305 | | -Процедура СохранитьФайлМетаданныхПакета(Знач КаталогУстановки, Знач ПутьКФайлуМетаданных) |
306 | | - |
307 | | - ПутьСохранения = ОбъединитьПути(КаталогУстановки, КонстантыOpm.ИмяФайлаМетаданныхПакета); |
| 328 | +Процедура СохранитьФайлМетаданныхПакета(Знач ПутьУстановки, Знач ПутьКФайлуМетаданных) |
| 329 | + |
| 330 | + ПутьСохранения = ОбъединитьПути(ПутьУстановки, КонстантыOpm.ИмяФайлаМетаданныхПакета); |
308 | 331 | ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлуМетаданных); |
309 | 332 | ДанныеФайла.Записать(ПутьСохранения); |
310 | | - |
| 333 | + |
311 | 334 | КонецПроцедуры |
312 | 335 |
|
313 | 336 | Процедура УдалитьКаталогУстановкиПриОшибке(Знач Каталог) |
|
324 | 347 | // |
325 | 348 |
|
326 | 349 | Функция ИзвлечьОбязательныйФайл(Знач Чтение, Знач ИмяФайла) |
327 | | - |
| 350 | + |
328 | 351 | ПутьФайла = ИзвлечьФайл(Чтение, ИмяФайла, мВременныйКаталогУстановки); |
329 | 352 | Если ПутьФайла = "" Тогда |
330 | 353 | ВызватьИсключение "Неверная структура пакета. Не найден файл " + ИмяФайла; |
331 | 354 | КонецЕсли; |
332 | | - |
| 355 | + |
333 | 356 | Возврат ПутьФайла; |
334 | | - |
| 357 | + |
335 | 358 | КонецФункции |
336 | 359 |
|
337 | 360 | Функция ИзвлечьФайл(Знач Чтение, Знач ИмяФайла, Знач КаталогКудаИзвлечь) |
338 | 361 | Лог.Отладка("Извлечение: %1", ИмяФайла); |
339 | | - Элемент = Чтение.Элементы.Найти(ИмяФайла); |
| 362 | + Лог.Отладка("Извлечение: КаталогКудаИзвлечь %1", КаталогКудаИзвлечь); |
| 363 | + |
| 364 | + Элемент = НайтиЭлементАрхива(Чтение, ИмяФайла); |
340 | 365 | Если Элемент = Неопределено Тогда |
341 | 366 | Лог.Отладка("Не удалось извлечь файл %1", ИмяФайла); |
342 | 367 | Возврат ""; |
343 | 368 | КонецЕсли; |
344 | | - |
| 369 | + |
345 | 370 | Чтение.Извлечь(Элемент, КаталогКудаИзвлечь); |
346 | | - |
| 371 | + |
347 | 372 | Возврат ОбъединитьПути(мВременныйКаталогУстановки, ИмяФайла); |
348 | | - |
| 373 | + |
| 374 | +КонецФункции |
| 375 | + |
| 376 | +Функция НайтиЭлементАрхива(Знач Чтение, Знач ПолноеИмя) |
| 377 | + Лог.Отладка("НайтиЭлементАрхива: ищем в архиве файл %1", ПолноеИмя); |
| 378 | + Файл = Новый Файл(ПолноеИмя); |
| 379 | + Если Лев(Файл.Путь, 2) = ".\" Или Лев(Файл.Путь, 2) = "./" Тогда |
| 380 | + ПолноеИмя = Файл.Имя; |
| 381 | + КонецЕсли; |
| 382 | + Для Каждого Элемент Из Чтение.Элементы Цикл |
| 383 | + |
| 384 | + Если НРег(Элемент.ПолноеИмя) = НРег(ПолноеИмя) Тогда |
| 385 | + Лог.Отладка("НайтиЭлементАрхива: нашли Элемент.ПолноеИмя %1", Элемент.ПолноеИмя); |
| 386 | + |
| 387 | + Возврат Элемент; |
| 388 | + КонецЕсли; |
| 389 | + КонецЦикла; |
| 390 | + Лог.Отладка("НайтиЭлементАрхива: не нашли элемент"); |
| 391 | + Возврат Неопределено; |
349 | 392 | КонецФункции |
350 | 393 |
|
351 | 394 | Лог = Логирование.ПолучитьЛог("oscript.app.opm"); |
|
0 commit comments