Install only missed dependencies for the private libraries // Resolve #2910

This commit is contained in:
Ivan Kravets
2022-04-01 17:25:40 +03:00
parent 25e786e6a5
commit e4fb675d5f
3 changed files with 50 additions and 16 deletions

View File

@ -199,30 +199,49 @@ def _install_project_env_custom_tools(project_env, options):
def _install_project_env_libraries(project_env, options):
already_up_to_date = not options.get("force")
config = ProjectConfig.get_instance()
lm = LibraryPackageManager(
env_lm = LibraryPackageManager(
os.path.join(config.get("platformio", "libdeps_dir"), project_env)
)
private_lm = LibraryPackageManager(
os.path.join(config.get("platformio", "lib_dir"))
)
if options.get("silent"):
lm.set_log_level(logging.WARN)
env_lm.set_log_level(logging.WARN)
private_lm.set_log_level(logging.WARN)
for library in config.get(f"env:{project_env}", "lib_deps"):
spec = PackageSpec(library)
# skip built-in dependencies
if not spec.external and not spec.owner:
continue
if not lm.get_package(spec):
if not env_lm.get_package(spec):
already_up_to_date = False
lm.install(
env_lm.install(
spec,
skip_dependencies=options.get("skip_dependencies"),
force=options.get("force"),
)
# install dependencies from the priate libraries
plm = LibraryPackageManager(os.path.join(config.get("platformio", "lib_dir")))
for pkg in plm.get_installed():
lm.install_dependencies(pkg, print_header=False)
for pkg in private_lm.get_installed():
_install_project_private_library_deps(pkg, private_lm, env_lm, options)
return not already_up_to_date
def _install_project_private_library_deps(private_pkg, private_lm, env_lm, options):
for dependency in private_lm.get_pkg_dependencies(private_pkg) or []:
spec = private_lm.dependency_to_spec(dependency)
# skip built-in dependencies
if not spec.external and not spec.owner:
continue
pkg = private_lm.get_package(spec)
if not pkg and not env_lm.get_package(spec):
pkg = env_lm.install(
spec,
skip_dependencies=True,
force=options.get("force"),
)
_install_project_private_library_deps(pkg, private_lm, env_lm, options)
def _install_project_env_custom_libraries(project_env, options):
already_up_to_date = not options.get("force")
config = ProjectConfig.get_instance()

View File

@ -117,7 +117,7 @@ class PackageManagerInstallMixin(object):
def install_dependencies(self, pkg, print_header=True):
assert isinstance(pkg, PackageItem)
dependencies = dependencies = self.get_pkg_dependencies(pkg)
dependencies = self.get_pkg_dependencies(pkg)
if not dependencies:
return
if print_header:

View File

@ -219,22 +219,37 @@ platform = native
"""
)
with fs.cd(str(project_dir)):
config = ProjectConfig()
# some deps were added by user manually
result = clirunner.invoke(
package_install_cmd,
[
"-g",
"--storage-dir",
config.get("platformio", "lib_dir"),
"-l",
"paulstoffregen/OneWire@^2.3.5",
],
)
validate_cliresult(result)
# ensure all deps are installed
result = clirunner.invoke(package_install_cmd)
validate_cliresult(result)
config = ProjectConfig()
installed_lib_pkgs = LibraryPackageManager(
os.path.join(config.get("platformio", "lib_dir"))
installed_private_pkgs = LibraryPackageManager(
config.get("platformio", "lib_dir")
).get_installed()
assert pkgs_to_specs(installed_lib_pkgs) == [
PackageSpec("My Private Lib@1.0.0")
assert pkgs_to_specs(installed_private_pkgs) == [
PackageSpec("OneWire@2.3.6"),
PackageSpec("My Private Lib@1.0.0"),
]
installed_libdeps_pkgs = LibraryPackageManager(
installed_env_pkgs = LibraryPackageManager(
os.path.join(config.get("platformio", "libdeps_dir"), "private")
).get_installed()
assert pkgs_to_specs(installed_libdeps_pkgs) == [
assert pkgs_to_specs(installed_env_pkgs) == [
PackageSpec("ArduinoJson@6.19.3"),
PackageSpec("DallasTemperature@3.9.1"),
PackageSpec("OneWire@2.3.6"),
]