добавила автоматическое разрешение зависимостей

This commit is contained in:
2026-05-25 22:54:23 +03:00
parent ac6e76ec81
commit dbdd5cd26d
4 changed files with 100 additions and 40 deletions

View File

@@ -1,4 +1,5 @@
# mypkg/core/package_manager.py
from .dependency_resolver import DependencyResolver
import json
import os
import shutil
@@ -24,62 +25,63 @@ class PackageManager:
self.sandbox_mode = False
self.db = DatabaseManager(self.root)
self.resolver = DependencyResolver(repo_path, self.db.installed)
def install(self, package_name: str, dry_run: bool = False) -> bool:
print_step(f"Поиск пакета {package_name}...")
meta_path = os.path.join(self.repo_path, "packages", package_name, "meta.json")
if not os.path.exists(meta_path):
print_error(f"Пакет {package_name} не найден")
return False
with open(meta_path, 'r') as f:
pkg_data = json.load(f)
pkg = Package(**pkg_data)
if self.db.is_installed(package_name):
print_warning(f"Пакет {package_name} уже установлен")
return True
# DRY-RUN: только показываем, ничего не делаем
# DRY-RUN: показываем, что будет
if dry_run:
print("🔍 РЕЖИМ DRY-RUN (ничего не устанавливается)")
print(f"\n📦 Будет установлен: {pkg.full_name()}")
if pkg.depends:
print(f" Зависимости: {', '.join(pkg.depends)}")
else:
print(f" Зависимости: нет")
print(f" Файлы ({len(pkg.files)}):")
for f in pkg.files:
print(f" {f['destination']}")
if self.sandbox_mode:
print(f"\n🏖️ Установка будет выполнена в песочницу: {self.root}")
try:
to_install = self.resolver.resolve(package_name)
except Exception as e:
print_error(f"Ошибка: {e}")
return False
print(f"\n📦 Будет установлено:")
for pkg in to_install:
print(f" {pkg.full_name()}")
if pkg.depends:
print(f" Зависимости: {', '.join(pkg.depends)}")
print(f"\n✅ Установка не произведена (dry-run)")
return True
# РЕАЛЬНАЯ УСТАНОВКА
print_package(f"Установка {pkg.full_name()}...")
print_step(f"Поиск пакета {package_name}...")
source_dir = os.path.join(self.repo_path, "packages", package_name, "files")
# 1. Разрешаем зависимости
try:
to_install = self.resolver.resolve(package_name)
except Exception as e:
print_error(f"Ошибка разрешения зависимостей: {e}")
return False
for file_info in pkg.files:
src = os.path.join(source_dir, file_info["source"])
dst = os.path.join(self.root, file_info["destination"].lstrip("/"))
# 2. Устанавливаем всё по порядку
for pkg in to_install:
if self.db.is_installed(pkg.name):
print_info(f"{pkg.name} уже установлен")
continue
os.makedirs(os.path.dirname(dst), exist_ok=True)
shutil.copy2(src, dst)
print_step(f"Установка {pkg.full_name()}...")
if "permissions" in file_info:
os.chmod(dst, file_info["permissions"])
self.db.add_package(pkg)
print_success(f"Пакет {package_name} установлен")
source_dir = os.path.join(self.repo_path, "packages", pkg.name, "files")
for file_info in pkg.files:
src = os.path.join(source_dir, file_info["source"])
dst = os.path.join(self.root, file_info["destination"].lstrip("/"))
os.makedirs(os.path.dirname(dst), exist_ok=True)
shutil.copy2(src, dst)
if "permissions" in file_info:
os.chmod(dst, file_info["permissions"])
self.db.add_package(pkg)
print_success(f"{pkg.name} установлен")
if self.sandbox_mode:
print_info(f"Файлы в: {self.root}")
print_success(f"Пакет {package_name} и его зависимости установлены")
return True
def remove(self, package_name: str, force: bool = False, dry_run: bool = False) -> bool: