Install/Uninstall dependencies only for library-type packages // Resolve #3637

This commit is contained in:
Ivan Kravets
2020-08-24 15:10:38 +03:00
parent d6d95e05e8
commit 13db51a556
3 changed files with 48 additions and 42 deletions

View File

@ -21,7 +21,7 @@ import click
from platformio import app, compat, fs, util from platformio import app, compat, fs, util
from platformio.package.exception import PackageException from platformio.package.exception import PackageException
from platformio.package.meta import PackageItem, PackageSpec from platformio.package.meta import PackageItem
from platformio.package.unpack import FileUnpacker from platformio.package.unpack import FileUnpacker
from platformio.package.vcsclient import VCSClientFactory from platformio.package.vcsclient import VCSClientFactory
@ -119,30 +119,7 @@ class PackageManagerInstallMixin(object):
return pkg return pkg
def install_dependencies(self, pkg, silent=False): def install_dependencies(self, pkg, silent=False):
assert isinstance(pkg, PackageItem) pass
manifest = self.load_manifest(pkg)
if not manifest.get("dependencies"):
return
if not silent:
self.print_message("Installing dependencies...")
for dependency in manifest.get("dependencies"):
if not self._install_dependency(dependency, silent) and not silent:
self.print_message(
"Warning! Could not install dependency %s for package '%s'"
% (dependency, pkg.metadata.name),
fg="yellow",
)
def _install_dependency(self, dependency, silent=False):
spec = PackageSpec(
name=dependency.get("name"), requirements=dependency.get("version")
)
search_filters = {
key: value
for key, value in dependency.items()
if key in ("authors", "platforms", "frameworks")
}
return self._install(spec, search_filters=search_filters or None, silent=silent)
def install_from_url(self, url, spec, checksum=None, silent=False): def install_from_url(self, url, spec, checksum=None, silent=False):
spec = self.ensure_spec(spec) spec = self.ensure_spec(spec)

View File

@ -19,7 +19,7 @@ import click
from platformio import fs from platformio import fs
from platformio.package.exception import UnknownPackageError from platformio.package.exception import UnknownPackageError
from platformio.package.meta import PackageItem, PackageSpec from platformio.package.meta import PackageSpec
class PackageManagerUninstallMixin(object): class PackageManagerUninstallMixin(object):
@ -73,18 +73,4 @@ class PackageManagerUninstallMixin(object):
return pkg return pkg
def uninstall_dependencies(self, pkg, silent=False): def uninstall_dependencies(self, pkg, silent=False):
assert isinstance(pkg, PackageItem) pass
manifest = self.load_manifest(pkg)
if not manifest.get("dependencies"):
return
if not silent:
self.print_message("Removing dependencies...", fg="yellow")
for dependency in manifest.get("dependencies"):
pkg = self.get_package(
PackageSpec(
name=dependency.get("name"), requirements=dependency.get("version")
)
)
if not pkg:
continue
self._uninstall(pkg, silent=silent)

View File

@ -17,7 +17,7 @@ import os
from platformio.package.exception import MissingPackageManifestError from platformio.package.exception import MissingPackageManifestError
from platformio.package.manager.base import BasePackageManager from platformio.package.manager.base import BasePackageManager
from platformio.package.meta import PackageSpec, PackageType from platformio.package.meta import PackageItem, PackageSpec, PackageType
from platformio.project.helpers import get_project_global_lib_dir from platformio.project.helpers import get_project_global_lib_dir
@ -62,3 +62,46 @@ class LibraryPackageManager(BasePackageManager): # pylint: disable=too-many-anc
return os.path.dirname(root) return os.path.dirname(root)
return root return root
return path return path
def install_dependencies(self, pkg, silent=False):
assert isinstance(pkg, PackageItem)
manifest = self.load_manifest(pkg)
if not manifest.get("dependencies"):
return
if not silent:
self.print_message("Installing dependencies...")
for dependency in manifest.get("dependencies"):
if not self._install_dependency(dependency, silent) and not silent:
self.print_message(
"Warning! Could not install dependency %s for package '%s'"
% (dependency, pkg.metadata.name),
fg="yellow",
)
def _install_dependency(self, dependency, silent=False):
spec = PackageSpec(
name=dependency.get("name"), requirements=dependency.get("version")
)
search_filters = {
key: value
for key, value in dependency.items()
if key in ("authors", "platforms", "frameworks")
}
return self._install(spec, search_filters=search_filters or None, silent=silent)
def uninstall_dependencies(self, pkg, silent=False):
assert isinstance(pkg, PackageItem)
manifest = self.load_manifest(pkg)
if not manifest.get("dependencies"):
return
if not silent:
self.print_message("Removing dependencies...", fg="yellow")
for dependency in manifest.get("dependencies"):
pkg = self.get_package(
PackageSpec(
name=dependency.get("name"), requirements=dependency.get("version")
)
)
if not pkg:
continue
self._uninstall(pkg, silent=silent)