Skip to content

OPM в оффлайне #238

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/cmd/opm.os
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@
Приложение.ДобавитьКоманду("test", НСтр("ru='Выполнить тестирование проекта';en='Run project testing'"), Новый КомандаOpm_Test);
Приложение.ДобавитьКоманду("u update", НСтр("ru='Обновить пакет';en='Update package'"), Новый КомандаOpm_Update);
Приложение.ДобавитьКоманду("version", НСтр("ru='Вывести версию продукта';en='show application version'"), Новый КомандаOpm_Version);
Приложение.ДобавитьКоманду("dl download",
НСтр("ru='Скачать файл пакета и файлы зависимостей';
|en='Download package and dependencies'"),
Новый КомандаOpm_Download);

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

Expand Down
137 changes: 137 additions & 0 deletions src/cmd/Классы/КомандаOpm_Download.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// Прикладной интерфейс

Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт

КомандаПриложения.Опция("a all", Ложь, "Установить все пакеты, зарегистрированные в хабе");
КомандаПриложения.Опция("f file", "", "Указать файл из которого нужно установить пакет. Поддерживает указание маски файла для пакетной установки");
КомандаПриложения.Опция("u url", "", "Указать прямую интернет-ссылку на файл *.ospx из которого нужно установить пакет");

КомандаПриложения.Опция("dev", Ложь, "Признак установки пакетов для разработки");
КомандаПриложения.Опция("s skip-install-deps", Ложь, "признак пропуска установки зависимых пакетов");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я бы предложил имя ключа --no-deps

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я бы предложил имя ключа --no-deps

названия ключей оставил для совместимости с командой install

https://github.com/oscript-library/opm/blob/master/src/cmd/%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B/%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0Opm_Install.os#L12

КомандаПриложения.Опция("d dest", "", "Целевой каталог");

ОпцияЗеркала = КомандаПриложения.Опция("m mirror", "", "Указать имя сервера, с которого необходимо ставить пакеты.
| Доступные сервера прописываются в конфигурационном файле opm.cfg, параметр 'СервераПакетов'.")
.ВОкружении("OPM_HUB_MIRROR")
.ТПеречисление();

МенеджерПолучения = Новый МенеджерПолученияПакетов();
Для Каждого ДоступноеЗеркало Из МенеджерПолучения.ИменаДоступныхСерверов() Цикл
ОпцияЗеркала.Перечисление(ДоступноеЗеркало, ДоступноеЗеркало, "Сервер '" + ДоступноеЗеркало + "'");
КонецЦикла;

КомандаПриложения.Аргумент("PACKAGE", "", "Имя пакета в хабе. Чтобы установить конкретную версию, используйте ИмяПакета@ВерсияПакета")
.ТМассивСтрок()
.Обязательный(Ложь);

// КомандаПриложения.Спек = "(-a | --all | -l | --local | -d | --dest )";

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

Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт

УстановкаПакетовРазработчика = КомандаПриложения.ЗначениеОпции("dev");
УстановкаВсехПакетов = КомандаПриложения.ЗначениеОпции("all");
КаталогУстановки = КомандаПриложения.ЗначениеОпции("dest");
ФайлПакетаУстановки = КомандаПриложения.ЗначениеОпции("file");
ИнтернетСсылкаНаПакет = КомандаПриложения.ЗначениеОпции("url");
МассивПакетовКУстановке = КомандаПриложения.ЗначениеАргумента("PACKAGE");

НеобходимоУстановитьЗависимости = Не КомандаПриложения.ЗначениеОпции("skip-install-deps");
ИмяСервера = КомандаПриложения.ЗначениеОпции("mirror");

РежимУстановки = РежимУстановкиПакетов.Скачивание;

Если Не ПустаяСтрока(КаталогУстановки) Тогда
ЦелевойКаталог = КаталогУстановки;
Иначе
ЦелевойКаталог = ТекущийКаталог();
КонецЕсли;
Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы());

Лог.Отладка("УстановкаПакетовРазработчика: %1", УстановкаПакетовРазработчика);
Лог.Отладка("УстановкаВсехПакетов: %1", УстановкаВсехПакетов);
Лог.Отладка("КаталогУстановки: %1", КаталогУстановки);
Лог.Отладка("ФайлПакетаУстановки: %1", ФайлПакетаУстановки);
Лог.Отладка("ИнтернетСсылкаНаПакет: %1", ИнтернетСсылкаНаПакет);
Лог.Отладка("МассивПакетовКУстановке: %1", МассивПакетовКУстановке.Количество());
Лог.Отладка("НеобходимоУстановитьЗависимости: %1", НеобходимоУстановитьЗависимости);

НастройкаУстановки = РаботаСПакетами.ПолучитьНастройкуУстановки();
НастройкаУстановки.УстанавливатьЗависимости = НеобходимоУстановитьЗависимости;
НастройкаУстановки.УстанавливатьЗависимостиРазработчика = УстановкаПакетовРазработчика;
НастройкаУстановки.СоздаватьФайлыЗапуска = Ложь;
НастройкаУстановки.ИмяСервера = ИмяСервера;

Если УстановкаВсехПакетов Тогда
РаботаСПакетами.УстановитьВсеПакетыИзОблака(РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
ИначеЕсли ПустаяСтрока(ФайлПакетаУстановки) И ПустаяСтрока(ИнтернетСсылкаНаПакет) И МассивПакетовКУстановке.Количество() = 0 Тогда
РаботаСПакетами.УстановитьПакетыПоОписаниюПакета(РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
ИначеЕсли НЕ ПустаяСтрока(ФайлПакетаУстановки) Тогда

РазобранныйАдрес = СтрРазделить(ФайлПакетаУстановки, ПолучитьРазделительПути());
Путь = ".";
Маска = ФайлПакетаУстановки;
Если РазобранныйАдрес.Количество() > 1 Тогда // отделим последнюю секцию как имя файла, а остальное опять соберем в строку пути

Маска = РазобранныйАдрес[РазобранныйАдрес.Количество() - 1];
РазобранныйАдрес.Удалить(РазобранныйАдрес.Количество() - 1);
Путь = СтрСоединить(РазобранныйАдрес, ПолучитьРазделительПути());

КонецЕсли;

ФайлыПоМаске = НайтиФайлы(Путь, Маска);
Для Каждого ФайлПакета Из ФайлыПоМаске Цикл

РаботаСПакетами.УстановитьПакетИзФайла(ФайлПакета.ПолноеИмя, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я не очень понял, какое отношение команда download имеет к установке из локального файла...

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я не очень понял, какое отношение команда download имеет к установке из локального файла...

зависимости тащить

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А она вытащит все версии пакета зависимости или какую-то конкретную, собственно, от которой зависит?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

вытащит конкретную. НО, если другие пакеты по цепочке зависимостей хотят другую версию - вытащит и другую конкретную тоже.

Например, при скачивании зависимостей ванесса-раннера у меня по итогу три версии ассертсов: 0.4.0, 1.3.0 и 1.4.0


КонецЦикла;

ИначеЕсли НЕ ПустаяСтрока(ИнтернетСсылкаНаПакет) Тогда

позСервер = СтрНайти(ИнтернетСсылкаНаПакет, "/", , , 3);
Сервер = Лев(ИнтернетСсылкаНаПакет, позСервер-1);
Адрес = Сред(ИнтернетСсылкаНаПакет, позСервер);
Если Нрег(Лев(Сервер, 5)) = "https" Тогда
Порт = 443;
Иначе
Порт = 80;
КонецЕсли;

Соединение = Новый HTTPСоединение(Сервер, Порт);
Запрос = Новый HTTPЗапрос(Адрес);
Ответ = Соединение.Получить(Запрос);
ДД = Ответ.ПолучитьТелоКакДвоичныеДанные();
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("ospx");
ДД.Записать(ИмяВременногоФайла);

РаботаСПакетами.УстановитьПакетИзФайла(ИмяВременногоФайла, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);

УдалитьФайлы(ИмяВременногоФайла);

Иначе

Для каждого ИмяПакета Из МассивПакетовКУстановке Цикл

Если ЭтоФайлПакета(ИмяПакета) Тогда

РаботаСПакетами.УстановитьПакетИзФайла(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);

Иначе

РаботаСПакетами.УстановитьПакетИзОблака(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);

КонецЕсли;

КонецЦикла;

КонецЕсли;

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

Функция ЭтоФайлПакета(Знач ИмяПакета)

Возврат СтрЗаканчиваетсяНа(НРег(ИмяПакета), ".ospx");

КонецФункции
2 changes: 1 addition & 1 deletion src/cmd/Классы/КомандаOpm_Install.os
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
КонецЕсли;
Лог = Логирование.ПолучитьЛог(ПараметрыПриложенияOpm.ИмяЛогаСистемы());

Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда
Если (РежимУстановки = РежимУстановкиПакетов.Локально) И ЗначениеЗаполнено(ЦелевойКаталог) Тогда
Лог.Предупреждение("При локальной установке параметр -dest игнорируется");
ЦелевойКаталог = Неопределено;
КонецЕсли;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,24 @@
ДанныеПакета = УстановленныеПакеты.Получить(ОписаниеЗависимости.ИмяПакета);
ПакетУстановлен = ДанныеПакета <> Неопределено;
Если ПакетУстановлен И НЕ ПустаяСтрока(КаталогПоискаБиблиотек) Тогда
КаталогБиблиотекПакета = Новый Файл(ОбъединитьПути(ДанныеПакета.КаталогПакета, "..")).ПолноеИмя;
КаталогБиблиотекПакета = Новый Файл(ДанныеПакета.КаталогПакета).Путь;
ПакетУстановлен = ФС.ПутиРавны(КаталогБиблиотекПакета, КаталогПоискаБиблиотек);
КонецЕсли;

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

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

Лог.Отладка("ПакетУстановлен: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)",
УстановленнаяВерсия,
ОписаниеЗависимости.МинимальнаяВерсия);

ВерсияSNAPSHOT = "SNAPSHOT";
Если ОписаниеЗависимости.МинимальнаяВерсия = ВерсияSNAPSHOT И УстановленнаяВерсия = ВерсияSNAPSHOT Тогда
Expand Down Expand Up @@ -82,21 +85,6 @@

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

Процедура Инициализация()

Лог = Логирование.ПолучитьЛог("oscript.app.opm");
МассивКаталоговПоискаБиблиотек = Новый Массив;

КаталогСистемныхБиблиотек = ОбъединитьПути(
КаталогПрограммы(),
ПолучитьЗначениеСистемнойНастройки("lib.system")
);

МассивКаталоговПоискаБиблиотек.Добавить(КаталогСистемныхБиблиотек);
ДобавитьКаталогБиблиотек("./" + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов);

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

// Добавляет каталог в список, по которому выполняется поиск библиотек
Процедура ДобавитьКаталогБиблиотек(Знач Каталог) Экспорт

Expand All @@ -109,7 +97,7 @@
ПутьКФайлуМетаданных = ОбъединитьПути(ФайлКаталога.ПолноеИмя, КонстантыOpm.ИмяФайлаМетаданныхПакета);
ФайлМетаданных = Новый Файл(ПутьКФайлуМетаданных);
Если ФайлМетаданных.Существует() Тогда
МетаОписаниеПакета = ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
МетаОписаниеПакета = РаботаСПакетами.ПрочитатьМетаданныеПакета(ПутьКФайлуМетаданных);
Иначе
// @deprecated
МетаОписаниеПакета = Истина;
Expand All @@ -123,25 +111,6 @@

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

Функция ПрочитатьМетаданныеПакета(Знач ПутьКФайлуМетаданных)

Перем Метаданные;
Попытка
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлуМетаданных);
Сериализатор = Новый СериализацияМетаданныхПакета;
Метаданные = Сериализатор.ПрочитатьXML(Чтение);

Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;

Возврат Метаданные;

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

Функция ПолучитьПутьКФайлуМетаданныхБиблиотеки(ИмяПакета) Экспорт

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