Skip to content

Commit 6b395c8

Browse files
authored
Merge pull request #238 from dmpas/feature/opm-download
OPM в оффлайне
2 parents 6a36f7c + 4f14dea commit 6b395c8

12 files changed

+428
-76
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+
КонецФункции

src/cmd/Классы/КомандаOpm_Install.os

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
КонецЕсли;
5858
Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы());
5959

60-
Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда
60+
Если (РежимУстановки = РежимУстановкиПакетов.Локально) И ЗначениеЗаполнено(ЦелевойКаталог) Тогда
6161
Лог.Предупреждение("При локальной установке параметр -dest игнорируется");
6262
ЦелевойКаталог = Неопределено;
6363
КонецЕсли;

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

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,24 @@
1818
ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета);
1919
ПакетУстановлен = ДанныеПакета <> Неопределено;
2020
Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда
21-
КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя;
21+
КаталогБиблиотекПакета = Новый Файл(ДанныеПакета.КаталогПакета).Путь;
2222
ПакетУстановлен = ФС.ПутиРавны(КаталогБиблиотекПакета, КаталогПоискаБиблиотек);
2323
КонецЕсли;
2424

2525
ПутьКФайлуМетаданных = ПолучитьПутьКФайлуМетаданныхБиблиотеки(ОписаниеЗависимости.ИмяПакета);
2626

2727
ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
2828
Если ФайлМетаданных.Существует() Тогда
29-
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
29+
МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
3030
УстановленнаяВерсия = МетаОписаниеПакета.Свойства().Версия;
3131
Иначе
3232
// @deprecated
3333
УстановленнаяВерсия = "0";
3434
КонецЕсли;
35-
Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", УстановленнаяВерсия, ОписаниеЗависимости.МинимальнаяВерсия);
35+
36+
Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)",
37+
УстановленнаяВерсия,
38+
ОписаниеЗависимости.МинимальнаяВерсия);
3639

3740
ВерсияSNAPSHOT = "SNAPSHOT";
3841
Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда
@@ -93,21 +96,6 @@
9396

9497
КонецФункции
9598

96-
Процедура Инициализация()
97-
98-
Лог = Логирование.ПолучитьЛог("oscript.app.opm");
99-
МассивКаталоговПоискаБиблиотек = Новый Массив;
100-
101-
КаталогСистемныхБиблиотек = ОбъединитьПути(
102-
КаталогПрограммы(),
103-
ПолучитьЗначениеСистемнойНастройки("lib.system")
104-
);
105-
106-
МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек);
107-
ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов);
108-
109-
КонецПроцедуры
110-
11199
// Добавляет каталог в список, по которому выполняется поиск библиотек
112100
Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт
113101

@@ -120,7 +108,7 @@
120108
ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета);
121109
ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
122110
Если ФайлМетаданных.Существует() Тогда
123-
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
111+
МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
124112
Иначе
125113
// @deprecated
126114
МетаОписаниеПакета = Истина;
@@ -134,25 +122,6 @@
134122

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

137-
Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных)
138-
139-
Перем Метаданные;
140-
Попытка
141-
Чтение = Новый ЧтениеXML;
142-
Чтение.ОткрытьФайл(ПутьКФайлуМетаданных);
143-
Сериализатор = Новый СериализацияМетаданныхПакета;
144-
Метаданные = Сериализатор.ПрочитатьXML(Чтение);
145-
146-
Чтение.Закрыть();
147-
Исключение
148-
Чтение.Закрыть();
149-
ВызватьИсключение;
150-
КонецПопытки;
151-
152-
Возврат Метаданные;
153-
154-
КонецФункции
155-
156125
Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт
157126

158127
ПутьКФайлуМетаданных = "";

0 commit comments

Comments
 (0)