Added support for dependencies declared in a "tool" type package

This commit is contained in:
Ivan Kravets
2022-02-18 17:51:07 +02:00
parent f34e6e9c4c
commit 6be17cec37
4 changed files with 52 additions and 58 deletions

View File

@ -18,6 +18,7 @@ PlatformIO Core 5
* `pio pkg outdated <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_pack.html>`__ - check for project outdated packages
* `pio pkg exec <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_exec.html>`_ - run command from package tool (`issue #4163 <https://github.com/platformio/platformio-core/issues/4163>`_)
- Added support for dependencies declared in a "tool" type package
- Dropped automatic updates of global libraries and development platforms (`issue #4179 <https://github.com/platformio/platformio-core/issues/4179>`_)
- Dropped support for "pythonPackages" field in "platform.json" manifest in favor of `Extra Python Dependencies <https://docs.platformio.org/en/latest/scripting/examples/extra_python_packages.html>`__

View File

@ -20,8 +20,8 @@ import tempfile
import click
from platformio import app, compat, fs, util
from platformio.package.exception import PackageException
from platformio.package.meta import PackageItem
from platformio.package.exception import PackageException, UnknownPackageError
from platformio.package.meta import PackageItem, PackageSpec
from platformio.package.unpack import FileUnpacker
from platformio.package.vcsclient import VCSClientFactory
@ -115,7 +115,38 @@ class PackageManagerInstallMixin(object):
return pkg
def install_dependencies(self, pkg):
pass
assert isinstance(pkg, PackageItem)
manifest = self.load_manifest(pkg)
dependencies = manifest.get("dependencies")
if not dependencies:
return
self.log.info("Resolving dependencies...")
for dependency in dependencies:
if not self._install_dependency(dependency):
self.log.warning(
click.style(
"Warning! Could not install dependency %s for package '%s'"
% (dependency, pkg.metadata.name),
fg="yellow",
)
)
def _install_dependency(self, dependency):
spec = PackageSpec(
owner=dependency.get("owner"),
name=dependency.get("name"),
requirements=dependency.get("version"),
)
search_filters = {
key: value
for key, value in dependency.items()
if key in ("authors", "platforms", "frameworks")
}
try:
return self._install(spec, search_filters=search_filters or None)
except UnknownPackageError:
pass
return None
def install_from_url(self, url, spec, checksum=None):
spec = self.ensure_spec(spec)

View File

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

View File

@ -15,14 +15,12 @@
import json
import os
import click
from platformio.package.exception import (
MissingPackageManifestError,
UnknownPackageError,
)
from platformio.package.manager.base import BasePackageManager
from platformio.package.meta import PackageItem, PackageSpec, PackageType
from platformio.package.meta import PackageSpec, PackageType
from platformio.project.config import ProjectConfig
@ -107,53 +105,3 @@ class LibraryPackageManager(BasePackageManager): # pylint: disable=too-many-anc
return True
raise e
def install_dependencies(self, pkg):
assert isinstance(pkg, PackageItem)
manifest = self.load_manifest(pkg)
if not manifest.get("dependencies"):
return
self.log.info("Installing dependencies...")
for dependency in manifest.get("dependencies"):
if not self._install_dependency(dependency):
self.log.warning(
click.style(
"Warning! Could not install dependency %s for package '%s'"
% (dependency, pkg.metadata.name),
fg="yellow",
)
)
def _install_dependency(self, dependency):
spec = PackageSpec(
owner=dependency.get("owner"),
name=dependency.get("name"),
requirements=dependency.get("version"),
)
search_filters = {
key: value
for key, value in dependency.items()
if key in ("authors", "platforms", "frameworks")
}
try:
return self._install(spec, search_filters=search_filters or None)
except UnknownPackageError:
pass
return None
def uninstall_dependencies(self, pkg):
assert isinstance(pkg, PackageItem)
manifest = self.load_manifest(pkg)
if not manifest.get("dependencies"):
return
self.log.info(click.style("Removing dependencies...", fg="yellow"))
for dependency in manifest.get("dependencies"):
spec = PackageSpec(
owner=dependency.get("owner"),
name=dependency.get("name"),
requirements=dependency.get("version"),
)
pkg = self.get_package(spec)
if not pkg:
continue
self._uninstall(pkg)