Skip to content

Commit d917dd8

Browse files
committed
Новый механизм работу с плагинами и их установка
1 parent d4b42b1 commit d917dd8

11 files changed

+267
-1498
lines changed

src/cmd/Модули/ПараметрыПриложения.os

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
Процедура ПодготовитьПлагины(Знач Приложение) Экспорт
3030

31+
РаботаСПлагинами.ОбновитьИндексУстановленныхПлагинов();
32+
3133
МенеджерПлагинов = Новый МенеджерПлагинов;
3234
МенеджерПлагинов.ЗагрузитьПлагины();
3335

src/core/Классы/МенеджерПлагинов.os

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,8 @@
845845
КонецФункции
846846

847847
Процедура Инициализация()
848+
849+
Лог = Логирование.ПолучитьЛог("oscript.app.gitsync_plugins");
848850

849851
ПараметрыКоманды = Новый Массив;
850852
РефлекторПроверкиКоманд = Новый Рефлектор;
@@ -855,7 +857,6 @@
855857
МассивЗагруженныхПлагинов = Новый Массив;
856858
УстановленныеПлагины = Новый Соответствие;
857859

858-
Лог = Логирование.ПолучитьЛог("oscript.app.gitsync_plugins");
859860
//Лог.УстановитьУровень(УровниЛога.Отладка);
860861

861862
КонецПроцедуры
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#Использовать "../../../plugins"
2+
3+
Перем КаталогУстановкиGitSync;
4+
Перем КаталогПлагинов;
5+
Перем КаталогЗависимостей;
6+
7+
Функция ПолучитьКаталогGitsync() Экспорт
8+
9+
Если КаталогУстановкиGitSync = Неопределено Тогда
10+
11+
КаталогУстановкиGitSync = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "..", "..", "..")).ПолноеИмя;
12+
13+
КонецЕсли;
14+
15+
Возврат КаталогУстановкиGitSync;
16+
17+
КонецФункции
18+
19+
Функция ПолучитьКаталогПлагинов() Экспорт
20+
21+
Если КаталогПлагинов = Неопределено Тогда
22+
23+
КаталогПлагинов = ОбъединитьПути(ПолучитьКаталогGitsync(), "plugins");
24+
25+
КонецЕсли;
26+
27+
Возврат КаталогПлагинов;
28+
29+
КонецФункции
30+
31+
Функция ПолучитьКаталогЗависимостей() Экспорт
32+
33+
Если КаталогЗависимостей = Неопределено Тогда
34+
35+
КаталогЗависимостей = ОбъединитьПути(ПолучитьКаталогGitsync(), "oscript_modules");
36+
37+
КонецЕсли;
38+
39+
Возврат КаталогЗависимостей;
40+
41+
КонецФункции
42+

src/core/Модули/РаботаСПлагинами.os

Lines changed: 219 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
#Использовать opm
22
#Использовать gitrunner
3-
#Использовать "../../pluginsLoader"
43

5-
Перем КаталогУстановкиGitSync;
4+
Перем ВнутреннийМенеджерУстановкиПакетов;
5+
Перем ИндексУстановленныхПлагинов;
6+
Перем Лог;
67

78
Функция ПолучитьУстановленныеПлагины() Экспорт
89

9-
Возврат ЗагруженныеПлагины.ПолучитьЗагруженныеПлагины();
10+
Возврат ИндексУстановленныхПлагинов;
1011

1112
КонецФункции
1213

@@ -16,12 +17,196 @@
1617

1718
КонецФункции
1819

20+
Процедура ОбновитьЗагрузчикБиблиотекВКаталогеПлагинов()
21+
22+
КаталогиПлагинов = НайтиФайлы(НастройкиGitsync.ПолучитьКаталогПлагинов(), ПолучитьМаскуВсеФайлы(), Ложь);
23+
24+
ШапкаЗагрузчика = "//////////////////////////////////////////////////////
25+
|// ДАННЫЙ ФАЙЛ ФОРМИРУЕТСЯ АВТОМАТИЧЕСКИ //
26+
|// ВСЕ ВНЕСЕННЫЕ ИЗМЕНЕНИЯ В РУЧНУЮ БУДУТ ПОТЕРЯНЫ //
27+
|//////////////////////////////////////////////////////";
28+
29+
30+
ШаблонСтрокиИмпортаПлагина = "
31+
|///////////////////////////////////
32+
|// ИМПОРТ БИБЛИОТЕКИ ПЛАГИНА ""%1""
33+
|#Использовать ""./%1""
34+
|///////////////////////////////////";
35+
36+
ТекстИмпортаБиблиотек = "
37+
|";
38+
39+
Для каждого Каталоги Из КаталогиПлагинов Цикл
40+
41+
Если Не Каталоги.ЭтоКаталог() Тогда
42+
Продолжить
43+
КонецЕсли;
44+
45+
ТекстИмпортаБиблиотек = ТекстИмпортаБиблиотек + СтрШаблон(ШаблонСтрокиИмпортаПлагина, Каталоги.Имя) + Символы.ПС;
46+
47+
КонецЦикла;
48+
49+
ТекстОтказаОтСтандартнойЗагруки = "
50+
|Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ)
51+
|
52+
| СтандартнаяОбработка = Ложь;
53+
|
54+
|КонецПроцедуры
55+
|";
56+
57+
ИтоговыйТекстФайлаЗагрузкиБиблиотек = ШапкаЗагрузчика + ТекстИмпортаБиблиотек + ТекстОтказаОтСтандартнойЗагруки;
58+
59+
ЗаписатьФайлЗагрузкиПлагинов(ИтоговыйТекстФайлаЗагрузкиБиблиотек);
60+
61+
КонецПроцедуры
62+
63+
Процедура ЗаписатьФайлЗагрузкиПлагинов(ТекстОбработчика)
64+
65+
ПутьКФайлуЗагрузчику = ОбъединитьПути(НастройкиGitsync.ПолучитьКаталогПлагинов(), "package-loader.os");
66+
Лог.Отладка("ПутьКФайлуЗагрузчику = <%1>", ПутьКФайлуЗагрузчику);
67+
Попытка
68+
Запись = Новый ЗаписьТекста(ПутьКФайлуЗагрузчику, "utf-8");
69+
Запись.ЗаписатьСтроку(ТекстОбработчика);
70+
Запись.Закрыть();
71+
Исключение
72+
Если Запись <> Неопределено Тогда
73+
ОсвободитьОбъект(Запись);
74+
КонецЕсли;
75+
ВызватьИсключение;
76+
КонецПопытки;
77+
78+
КонецПроцедуры
79+
80+
Процедура ОбновитьИндексУстановленныхПлагинов() Экспорт
81+
82+
Лог.Отладка("Обновление индекса плагина");
83+
ИндексУстановленныхПлагинов = Новый Соответствие;
84+
85+
КаталогиПлагинов = НайтиФайлы(НастройкиGitsync.ПолучитьКаталогПлагинов(), ПолучитьМаскуВсеФайлы(), Ложь);
86+
87+
Для каждого Каталоги Из КаталогиПлагинов Цикл
88+
89+
Если Не Каталоги.ЭтоКаталог() Тогда
90+
Продолжить
91+
КонецЕсли;
92+
93+
ЗагрузитьПлагин(Каталоги.ПолноеИмя);
94+
95+
КонецЦикла;
96+
97+
Лог.Отладка("В индекс плагинов добавлено <%1> плагинов", ИндексУстановленныхПлагинов.Количество());
98+
99+
100+
КонецПроцедуры
101+
102+
Процедура ЗагрузитьПлагин(Путь)
103+
104+
//Сообщить("Загружаю плагин");
105+
Лог.Отладка("
106+
|Загружаю плагин " + Путь);
107+
108+
ФайлМанифеста = Новый Файл(ОбъединитьПути(Путь, "lib.config"));
109+
110+
Если ФайлМанифеста.Существует() Тогда
111+
Лог.Отладка("Обрабатываем по манифесту");
112+
113+
СтандартнаяОбработка = Ложь;
114+
ДобавитьКлассыПлагинов(ФайлМанифеста.ПолноеИмя, Путь);
115+
Иначе
116+
Лог.Информация("Плагины из каталога <%1> не могут быть загружены - не найден файл <lib.config>");
117+
КонецЕсли;
118+
119+
КонецПроцедуры
120+
121+
Процедура ДобавитьКлассыПлагинов(Знач Файл, Знач Путь)
122+
123+
Чтение = Новый ЧтениеXML;
124+
Чтение.ОткрытьФайл(Файл);
125+
Чтение.ПерейтиКСодержимому();
126+
127+
Если Чтение.ЛокальноеИмя <> "package-def" Тогда
128+
Чтение.Закрыть();
129+
Возврат;
130+
КонецЕсли;
131+
132+
Пока Чтение.Прочитать() Цикл
133+
134+
Если Чтение.ТипУзла = ТипУзлаXML.Комментарий Тогда
135+
136+
Продолжить;
137+
138+
КонецЕсли;
139+
140+
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
141+
142+
Если Чтение.ЛокальноеИмя = "class" Тогда
143+
ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file"));
144+
Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда
145+
Идентификатор = Чтение.ЗначениеАтрибута("name");
146+
Если Не ПустаяСтрока(Идентификатор) Тогда
147+
// ДобавитьКласс(ФайлКласса.ПолноеИмя, Идентификатор);
148+
ДобавитьПлагинВИндекс(Идентификатор);
149+
КонецЕсли;
150+
Иначе
151+
ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте";
152+
КонецЕсли;
153+
154+
Чтение.Прочитать(); // в конец элемента
155+
156+
КонецЕсли;
157+
158+
КонецЕсли;
159+
160+
КонецЦикла;
161+
162+
Чтение.Закрыть();
163+
164+
КонецПроцедуры
165+
166+
Процедура ДобавитьПлагинВИндекс(Знач ИмяКлассаПлагина)
167+
168+
Лог.Отладка("Добавляю плагин <%1> в индекс плагинов", ИмяКлассаПлагина);
169+
170+
Попытка
171+
КлассПлагина = Новый (ИмяКлассаПлагина);
172+
Исключение
173+
Лог.Отладка("Ошибка добавления плагина <%1> в индекс плагинов. Класс <%1> не найден", ИмяКлассаПлагина);
174+
Возврат;
175+
КонецПопытки;
176+
177+
ОписаниеПлагина = Неопределено;
178+
179+
Если ЭтоКлассПлагина(КлассПлагина, ОписаниеПлагина) Тогда
180+
МетаданныеПлагина = НовыеМетаданныеПлагина(ИмяКлассаПлагина, ОписаниеПлагина);
181+
ИндексУстановленныхПлагинов.Вставить(МетаданныеПлагина.ИмяПлагина, МетаданныеПлагина);
182+
КонецЕсли;
183+
184+
КонецПроцедуры
185+
186+
Функция НовыеМетаданныеПлагина(Знач ИмяКлассаПлагина, Знач ОписаниеПлагина)
187+
188+
Лог.Отладка("Формирую метаданные плагина <%1>", ИмяКлассаПлагина);
189+
190+
Возврат Новый Структура("Класс, ИмяПлагина, Описание", ИмяКлассаПлагина, ОписаниеПлагина.ИмяПакета, ОписаниеПлагина);
191+
192+
КонецФункции
193+
194+
Функция ЭтоКлассПлагина(Знач КлассПлагина, ОписаниеПлагина)
195+
196+
Попытка
197+
ОписаниеПлагина = КлассПлагина.ОписаниеПлагина();
198+
Возврат Истина;
199+
Исключение
200+
Возврат Ложь;
201+
КонецПопытки;
202+
203+
КонецФункции
19204

20205
Функция ПолучитьВключенныеПлагины() Экспорт
21206

22207
ВключенныеПлагины = Новый Соответствие;
23208

24-
ИмяФайла = ОбъединитьПути(КаталогУстановкиGitSync, ".enabled-plugins");
209+
ИмяФайла = ОбъединитьПути(НастройкиGitsync.ПолучитьКаталогGitsync(), ".enabled-plugins");
25210
ФайлАктивныхПлагинов= Новый Файл(ИмяФайла);
26211

27212
Если Не ФайлАктивныхПлагинов.Существует() Тогда
@@ -42,7 +227,7 @@
42227

43228
Процедура ВключитьПлагины(Знач ВключенныеПлагины) Экспорт
44229

45-
ИмяФайла = ОбъединитьПути(КаталогУстановкиGitSync, ".enabled-plugins");
230+
ИмяФайла = ОбъединитьПути(НастройкиGitsync.ПолучитьКаталогGitsync(), ".enabled-plugins");
46231

47232
Запись = Новый ЗаписьТекста(ИмяФайла);
48233
Для каждого ИмяПлагина Из ВключенныеПлагины Цикл
@@ -63,22 +248,36 @@
63248

64249
КонецФункции // ПрочитатьФайл()
65250

66-
Функция УстановитьФайлПлагин(Знач ПутьКПлагину) Экспорт
67-
68-
Команда = Новый Команда;
69-
Команда.УстановитьКоманду("opm");
70-
Команда.ДобавитьПараметр("install");
251+
252+
Функция ПолучитьМенеджерУстановкиПакетов()
253+
254+
Если ВнутреннийМенеджерУстановкиПакетов = Неопределено Тогда
255+
ВнутреннийМенеджерУстановкиПакетов = Новый МенеджерУстановкиПакетов(РежимУстановкиПакетов.Локально,
256+
НастройкиGitsync.ПолучитьКаталогПлагинов(),
257+
НастройкиGitsync.ПолучитьКаталогЗависимостей());
258+
ВнутреннийМенеджерУстановкиПакетов.УстановитьЦелевойКаталог(НастройкиGitsync.ПолучитьКаталогПлагинов());
259+
КонецЕсли;
260+
261+
Возврат ВнутреннийМенеджерУстановкиПакетов;
71262

72-
Команда.ДобавитьПараметр("-f");
73-
Команда.ДобавитьПараметр(ПутьКПлагину);
74-
Команда.ДобавитьПараметр("-dest");
75-
Команда.ДобавитьПараметр(ОбъединитьПути(КаталогУстановкиGitSync, "plugins"));
263+
КонецФункции
264+
265+
Функция УстановитьФайлПлагин(Знач ПутьКПлагину) Экспорт
76266

77-
КодВозврата = Команда.Исполнить();
78-
Если Не КодВозврата = 0 Тогда
79-
ВызватьИсключение Команда.ПолучитьВывод();
267+
ФайлПлагина = Новый Файл(ПутьКПлагину);
268+
269+
Если Не ФайлПлагина.Существует() Тогда
270+
Лог.КритичнаяОшибка("Плагин не установлен. Файл <%1> плагина не найден", ПутьКПлагину);
271+
ВызватьИсключение "";
80272
КонецЕсли;
81273

274+
ПутьКФайлуПлагина = ФайлПлагина.ПолноеИмя;
275+
276+
УстановщикПлагинов = ПолучитьМенеджерУстановкиПакетов();
277+
УстановщикПлагинов.УстановитьПакетИзАрхива(ПутьКПлагину);
278+
279+
ОбновитьЗагрузчикБиблиотекВКаталогеПлагинов();
280+
82281
КонецФункции
83282

84283
Функция УстановитьПлагинСGitHub(Знач URL, Знач ТегВерсия = Неопределено) Экспорт
@@ -106,10 +305,10 @@
106305

107306
Процедура УстановитьПакетИзАрхива(Знач ФайлАрхива) Экспорт
108307

109-
110308

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

311+
Лог = Логирование.ПолучитьЛог("oscript.app.gitsync_plugins");
113312

114-
КаталогУстановкиGitSync = ОбъединитьПути(ТекущийСценарий().Каталог, "..","..", "..");
115-
313+
ИндексУстановленныхПлагинов = Новый Соответствие;
314+
Лог.УстановитьУровень(УровниЛога.Отладка);

0 commit comments

Comments
 (0)