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): def _install_project_env_libraries(project_env, options):
already_up_to_date = not options.get("force") already_up_to_date = not options.get("force")
config = ProjectConfig.get_instance() config = ProjectConfig.get_instance()
lm = LibraryPackageManager( env_lm = LibraryPackageManager(
os.path.join(config.get("platformio", "libdeps_dir"), project_env) 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"): 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"): for library in config.get(f"env:{project_env}", "lib_deps"):
spec = PackageSpec(library) spec = PackageSpec(library)
# skip built-in dependencies # skip built-in dependencies
if not spec.external and not spec.owner: if not spec.external and not spec.owner:
continue continue
if not lm.get_package(spec): if not env_lm.get_package(spec):
already_up_to_date = False already_up_to_date = False
lm.install( env_lm.install(
spec, spec,
skip_dependencies=options.get("skip_dependencies"), skip_dependencies=options.get("skip_dependencies"),
force=options.get("force"), force=options.get("force"),
) )
# install dependencies from the priate libraries # install dependencies from the priate libraries
plm = LibraryPackageManager(os.path.join(config.get("platformio", "lib_dir"))) for pkg in private_lm.get_installed():
for pkg in plm.get_installed(): _install_project_private_library_deps(pkg, private_lm, env_lm, options)
lm.install_dependencies(pkg, print_header=False)
return not already_up_to_date 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): def _install_project_env_custom_libraries(project_env, options):
already_up_to_date = not options.get("force") already_up_to_date = not options.get("force")
config = ProjectConfig.get_instance() config = ProjectConfig.get_instance()

View File

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

View File

@ -219,22 +219,37 @@ platform = native
""" """
) )
with fs.cd(str(project_dir)): 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) result = clirunner.invoke(package_install_cmd)
validate_cliresult(result) validate_cliresult(result)
config = ProjectConfig() installed_private_pkgs = LibraryPackageManager(
installed_lib_pkgs = LibraryPackageManager( config.get("platformio", "lib_dir")
os.path.join(config.get("platformio", "lib_dir"))
).get_installed() ).get_installed()
assert pkgs_to_specs(installed_lib_pkgs) == [ assert pkgs_to_specs(installed_private_pkgs) == [
PackageSpec("My Private Lib@1.0.0") 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") os.path.join(config.get("platformio", "libdeps_dir"), "private")
).get_installed() ).get_installed()
assert pkgs_to_specs(installed_libdeps_pkgs) == [ assert pkgs_to_specs(installed_env_pkgs) == [
PackageSpec("ArduinoJson@6.19.3"), PackageSpec("ArduinoJson@6.19.3"),
PackageSpec("DallasTemperature@3.9.1"), PackageSpec("DallasTemperature@3.9.1"),
PackageSpec("OneWire@2.3.6"),
] ]