Skip to content

Commit 4f82b4a

Browse files
committed
opm download
Рекурсивное скачивание пакета с зависимостями.
1 parent b753afe commit 4f82b4a

File tree

6 files changed

+334
-11
lines changed

6 files changed

+334
-11
lines changed

src/cmd/opm.os

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
Приложение.ДобавитьКоманду("test", НСтр("ru='Выполнить тестирование проекта';en='Run project testing'"), Новый КомандаOpm_Test);
3939
Приложение.ДобавитьКоманду("u update", НСтр("ru='Обновить пакет';en='Update package'"), Новый КомандаOpm_Update);
4040
Приложение.ДобавитьКоманду("version", НСтр("ru='Вывести версию продукта';en='show application version'"), Новый КомандаOpm_Version);
41+
Приложение.ДобавитьКоманду("dl download",
42+
НСтр("ru='Скачать файл пакета и файлы зависимостей';
43+
|en='Download package and dependencies'"),
44+
Новый КомандаOpm_Download);
4145

4246
Приложение.Запустить(АргументыКоманднойСтроки);
4347

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
///////////////////////////////////////////////////////////////////////////////////////////////////
2+
// Прикладной интерфейс
3+
4+
Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт
5+
6+
КомандаПриложения.Опция("a all", Ложь, "Установить все пакеты, зарегистрированные в хабе");
7+
КомандаПриложения.Опция("f file", "", "Указать файл из которого нужно установить пакет. Поддерживает указание маски файла для пакетной установки");
8+
КомандаПриложения.Опция("u url", "", "Указать прямую интернет-ссылку на файл *.ospx из которого нужно установить пакет");
9+
10+
КомандаПриложения.Опция("dev", Ложь, "Признак установки пакетов для разработки");
11+
КомандаПриложения.Опция("s skip-install-deps", Ложь, "признак пропуска установки зависимых пакетов");
12+
КомандаПриложения.Опция("d dest", "", "Целевой каталог");
13+
14+
ОпцияЗеркала = КомандаПриложения.Опция("m mirror", "", "Указать имя сервера, с которого необходимо ставить пакеты.
15+
| Доступные сервера прописываются в конфигурационном файле opm.cfg, параметр 'СервераПакетов'.")
16+
.ВОкружении("OPM_HUB_MIRROR")
17+
.ТПеречисление();
18+
19+
МенеджерПолучения = Новый МенеджерПолученияПакетов();
20+
Для Каждого ДоступноеЗеркало Из МенеджерПолучения.ИменаДоступныхСерверов() Цикл
21+
ОпцияЗеркала.Перечисление(ДоступноеЗеркало, ДоступноеЗеркало, "Сервер '" + ДоступноеЗеркало + "'");
22+
КонецЦикла;
23+
24+
КомандаПриложения.Аргумент("PACKAGE", "", "Имя пакета в хабе. Чтобы установить конкретную версию, используйте ИмяПакета@ВерсияПакета")
25+
.ТМассивСтрок()
26+
.Обязательный(Ложь);
27+
28+
// КомандаПриложения.Спек = "(-a | --all | -l | --local | -d | --dest )";
29+
30+
КонецПроцедуры
31+
32+
Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт
33+
34+
УстановкаПакетовРазработчика = КомандаПриложения.ЗначениеОпции("dev");
35+
УстановкаВсехПакетов = КомандаПриложения.ЗначениеОпции("all");
36+
КаталогУстановки = КомандаПриложения.ЗначениеОпции("dest");
37+
ФайлПакетаУстановки = КомандаПриложения.ЗначениеОпции("file");
38+
ИнтернетСсылкаНаПакет = КомандаПриложения.ЗначениеОпции("url");
39+
МассивПакетовКУстановке = КомандаПриложения.ЗначениеАргумента("PACKAGE");
40+
41+
НеобходимоУстановитьЗависимости = Не КомандаПриложения.ЗначениеОпции("skip-install-deps");
42+
ИмяСервера = КомандаПриложения.ЗначениеОпции("mirror");
43+
44+
РежимУстановки = РежимУстановкиПакетов.Скачивание;
45+
46+
Если Не ПустаяСтрока(КаталогУстановки) Тогда
47+
ЦелевойКаталог = КаталогУстановки;
48+
Иначе
49+
ЦелевойКаталог = ТекущийКаталог();
50+
КонецЕсли;
51+
Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы());
52+
53+
Лог.Отладка("УстановкаПакетовРазработчика: %1", УстановкаПакетовРазработчика);
54+
Лог.Отладка("УстановкаВсехПакетов: %1", УстановкаВсехПакетов);
55+
Лог.Отладка("КаталогУстановки: %1", КаталогУстановки);
56+
Лог.Отладка("ФайлПакетаУстановки: %1", ФайлПакетаУстановки);
57+
Лог.Отладка("ИнтернетСсылкаНаПакет: %1", ИнтернетСсылкаНаПакет);
58+
Лог.Отладка("МассивПакетовКУстановке: %1", МассивПакетовКУстановке.Количество());
59+
Лог.Отладка("НеобходимоУстановитьЗависимости: %1", НеобходимоУстановитьЗависимости);
60+
61+
НастройкаУстановки = РаботаСПакетами.ПолучитьНастройкуУстановки();
62+
НастройкаУстановки.УстанавливатьЗависимости = НеобходимоУстановитьЗависимости;
63+
НастройкаУстановки.УстанавливатьЗависимостиРазработчика = УстановкаПакетовРазработчика;
64+
НастройкаУстановки.СоздаватьФайлыЗапуска = Ложь;
65+
НастройкаУстановки.ИмяСервера = ИмяСервера;
66+
67+
Если УстановкаВсехПакетов Тогда
68+
РаботаСПакетами.УстановитьВсеПакетыИзОблака(РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
69+
ИначеЕсли ПустаяСтрока(ФайлПакетаУстановки) И ПустаяСтрока(ИнтернетСсылкаНаПакет) И МассивПакетовКУстановке.Количество() = 0 Тогда
70+
РаботаСПакетами.УстановитьПакетыПоОписаниюПакета(РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
71+
ИначеЕсли НЕ ПустаяСтрока(ФайлПакетаУстановки) Тогда
72+
73+
РазобранныйАдрес = СтрРазделить(ФайлПакетаУстановки, ПолучитьРазделительПути());
74+
Путь = ".";
75+
Маска = ФайлПакетаУстановки;
76+
Если РазобранныйАдрес.Количество() > 1 Тогда // отделим последнюю секцию как имя файла, а остальное опять соберем в строку пути
77+
78+
Маска = РазобранныйАдрес[РазобранныйАдрес.Количество() - 1];
79+
РазобранныйАдрес.Удалить(РазобранныйАдрес.Количество() - 1);
80+
Путь = СтрСоединить(РазобранныйАдрес, ПолучитьРазделительПути());
81+
82+
КонецЕсли;
83+
84+
ФайлыПоМаске = НайтиФайлы(Путь, Маска);
85+
Для Каждого ФайлПакета Из ФайлыПоМаске Цикл
86+
87+
РаботаСПакетами.УстановитьПакетИзФайла(ФайлПакета.ПолноеИмя, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
88+
89+
КонецЦикла;
90+
91+
ИначеЕсли НЕ ПустаяСтрока(ИнтернетСсылкаНаПакет) Тогда
92+
93+
позСервер = СтрНайти(ИнтернетСсылкаНаПакет, "/", , , 3);
94+
Сервер = Лев(ИнтернетСсылкаНаПакет, позСервер-1);
95+
Адрес = Сред(ИнтернетСсылкаНаПакет, позСервер);
96+
Если Нрег(Лев(Сервер, 5)) = "https" Тогда
97+
Порт = 443;
98+
Иначе
99+
Порт = 80;
100+
КонецЕсли;
101+
102+
Соединение = Новый HTTPСоединение(Сервер, Порт);
103+
Запрос = Новый HTTPЗапрос(Адрес);
104+
Ответ = Соединение.Получить(Запрос);
105+
ДД = Ответ.ПолучитьТелоКакДвоичныеДанные();
106+
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("ospx");
107+
ДД.Записать(ИмяВременногоФайла);
108+
109+
РаботаСПакетами.УстановитьПакетИзФайла(ИмяВременногоФайла, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
110+
111+
УдалитьФайлы(ИмяВременногоФайла);
112+
113+
Иначе
114+
115+
Для каждого ИмяПакета Из МассивПакетовКУстановке Цикл
116+
117+
Если ЭтоФайлПакета(ИмяПакета) Тогда
118+
119+
РаботаСПакетами.УстановитьПакетИзФайла(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
120+
121+
Иначе
122+
123+
РаботаСПакетами.УстановитьПакетИзОблака(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
124+
125+
КонецЕсли;
126+
127+
КонецЦикла;
128+
129+
КонецЕсли;
130+
131+
КонецПроцедуры
132+
133+
Функция ЭтоФайлПакета(Знач ИмяПакета)
134+
135+
Возврат СтрЗаканчиваетсяНа(НРег(ИмяПакета), ".ospx");
136+
137+
КонецФункции
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
2+
#Использовать fs
3+
#Использовать logos
4+
#Использовать semver
5+
6+
Перем Лог;
7+
8+
Перем КаталогПоискаБиблиотек;
9+
10+
Перем УстановленныеПакеты;
11+
12+
Функция ПакетУстановлен(Знач ОписаниеЗависимости, Знач КаталогПоискаБиблиотек = "") Экспорт
13+
14+
Перем УстановленныеПакеты;
15+
УстановленныеПакеты = ПолучитьУстановленныеПакеты();
16+
17+
ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета);
18+
ПакетУстановлен = ДанныеПакета <> Неопределено;
19+
Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда
20+
КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя;
21+
ПакетУстановлен = ФС.ПутиРавны(КаталогБиблиотекПакета, КаталогПоискаБиблиотек);
22+
КонецЕсли;
23+
24+
ПутьКФайлуМетаданных = ПолучитьПутьКФайлуМетаданныхБиблиотеки(ОписаниеЗависимости.ИмяПакета);
25+
26+
ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
27+
Если ФайлМетаданных.Существует() Тогда
28+
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
29+
УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия;
30+
Иначе
31+
// @deprecated
32+
УстановленнаяВерсия = "0";
33+
КонецЕсли;
34+
Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия);
35+
36+
ВерсияSNAPSHOT = "SNAPSHOT";
37+
Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда
38+
УстановленаКорректнаяВерсия = Истина;
39+
ИначеЕсли ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия <> ВерсияSNAPSHOT Тогда
40+
УстановленаКорректнаяВерсия = Ложь;
41+
Иначе
42+
УстановленаКорректнаяВерсия = ОписаниеЗависимости.МинимальнаяВерсия = Неопределено
43+
ИЛИ Версии.СравнитьВерсии(УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия) >= 0;
44+
КонецЕсли;
45+
46+
Лог.Отладка("Пакет установлен: " + ПакетУстановлен);
47+
Лог.Отладка("Установлена корректная версия: " + УстановленаКорректнаяВерсия);
48+
Возврат ПакетУстановлен И УстановленаКорректнаяВерсия;
49+
50+
КонецФункции
51+
52+
Процедура Обновить() Экспорт
53+
54+
УстановленныеПакеты = Новый Соответствие;
55+
НайденныеФайлы = НайтиФайлы(КаталогПоискаБиблиотек, ПолучитьМаскуВсеФайлы());
56+
57+
Для Каждого ФайлКаталога Из НайденныеФайлы Цикл
58+
Если ФайлКаталога.ЭтоКаталог() Тогда
59+
60+
// ДобавитьУстановленныйПакет заменит уже добавленный пакет при совпадении имён
61+
// Соответственно, более поздние каталоги будут иметь приоритет
62+
ДобавитьУстановленныйПакет(ФайлКаталога);
63+
64+
КонецЕсли;
65+
КонецЦикла;
66+
67+
КонецПроцедуры
68+
69+
Функция ПолучитьУстановленныеПакеты() Экспорт
70+
71+
Если УстановленныеПакеты = Неопределено Тогда
72+
Обновить();
73+
КонецЕсли;
74+
75+
Возврат УстановленныеПакеты;
76+
77+
КонецФункции
78+
79+
// Добавляет каталог в список, по которому выполняется поиск библиотек
80+
Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт
81+
82+
//МассивКаталоговПоискаБиблиотек.Добавить(Каталог);
83+
84+
КонецПроцедуры
85+
86+
Процедура ДобавитьУстановленныйПакет(Знач ФайлКаталога)
87+
88+
ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета);
89+
ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
90+
Если ФайлМетаданных.Существует() Тогда
91+
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
92+
Иначе
93+
// @deprecated
94+
МетаОписаниеПакета = Истина;
95+
КонецЕсли;
96+
97+
СтруктураДанных = Новый Структура();
98+
СтруктураДанных.Вставить("МетаданныеПакета", МетаОписаниеПакета);
99+
СтруктураДанных.Вставить("КаталогПакета", ФайлКаталога.ПолноеИмя);
100+
101+
УстановленныеПакеты.Вставить(ФайлКаталога.Имя, СтруктураДанных);
102+
103+
КонецПроцедуры
104+
105+
Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных)
106+
107+
Перем Метаданные;
108+
Попытка
109+
Чтение = Новый ЧтениеXML;
110+
Чтение.ОткрытьФайл(ПутьКФайлуМетаданных);
111+
Сериализатор = Новый СериализацияМетаданныхПакета;
112+
Метаданные = Сериализатор.ПрочитатьXML(Чтение);
113+
114+
Чтение.Закрыть();
115+
Исключение
116+
Чтение.Закрыть();
117+
ВызватьИсключение;
118+
КонецПопытки;
119+
120+
Возврат Метаданные;
121+
122+
КонецФункции
123+
124+
Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт
125+
126+
ПутьКФайлуМетаданных = "";
127+
ВремПутьКФайлуМетаданных = ОбъединитьПути(
128+
КаталогПоискаБиблиотек,
129+
ИмяПакета,
130+
КонстантыOpm.ИмяФайлаМетаданныхПакета
131+
);
132+
133+
Лог.Отладка(Новый Файл(ВремПутьКФайлуМетаданных).ПолноеИмя);
134+
Если ФС.ФайлСуществует(ВремПутьКФайлуМетаданных) Тогда
135+
ПутьКФайлуМетаданных = ВремПутьКФайлуМетаданных;
136+
КонецЕсли;
137+
138+
Возврат ПутьКФайлуМетаданных;
139+
140+
КонецФункции
141+
142+
Процедура ПриСозданииОбъекта(Знач ЦелевойКаталогСкачиванияБиблиотек)
143+
144+
Лог = Логирование.ПолучитьЛог("oscript.app.opm");
145+
КаталогПоискаБиблиотек = ЦелевойКаталогСкачиванияБиблиотек;
146+
147+
КонецПроцедуры

0 commit comments

Comments
 (0)