Skip to content

Commit e4fb675

Browse files
committed
Install only missed dependencies for the private libraries // Resolve #2910
1 parent 25e786e commit e4fb675

File tree

3 files changed

+50
-16
lines changed

3 files changed

+50
-16
lines changed

platformio/package/commands/install.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -199,30 +199,49 @@ def _install_project_env_custom_tools(project_env, options):
199199
def _install_project_env_libraries(project_env, options):
200200
already_up_to_date = not options.get("force")
201201
config = ProjectConfig.get_instance()
202-
lm = LibraryPackageManager(
202+
env_lm = LibraryPackageManager(
203203
os.path.join(config.get("platformio", "libdeps_dir"), project_env)
204204
)
205+
private_lm = LibraryPackageManager(
206+
os.path.join(config.get("platformio", "lib_dir"))
207+
)
205208
if options.get("silent"):
206-
lm.set_log_level(logging.WARN)
209+
env_lm.set_log_level(logging.WARN)
210+
private_lm.set_log_level(logging.WARN)
207211
for library in config.get(f"env:{project_env}", "lib_deps"):
208212
spec = PackageSpec(library)
209213
# skip built-in dependencies
210214
if not spec.external and not spec.owner:
211215
continue
212-
if not lm.get_package(spec):
216+
if not env_lm.get_package(spec):
213217
already_up_to_date = False
214-
lm.install(
218+
env_lm.install(
215219
spec,
216220
skip_dependencies=options.get("skip_dependencies"),
217221
force=options.get("force"),
218222
)
219223
# install dependencies from the priate libraries
220-
plm = LibraryPackageManager(os.path.join(config.get("platformio", "lib_dir")))
221-
for pkg in plm.get_installed():
222-
lm.install_dependencies(pkg, print_header=False)
224+
for pkg in private_lm.get_installed():
225+
_install_project_private_library_deps(pkg, private_lm, env_lm, options)
223226
return not already_up_to_date
224227

225228

229+
def _install_project_private_library_deps(private_pkg, private_lm, env_lm, options):
230+
for dependency in private_lm.get_pkg_dependencies(private_pkg) or []:
231+
spec = private_lm.dependency_to_spec(dependency)
232+
# skip built-in dependencies
233+
if not spec.external and not spec.owner:
234+
continue
235+
pkg = private_lm.get_package(spec)
236+
if not pkg and not env_lm.get_package(spec):
237+
pkg = env_lm.install(
238+
spec,
239+
skip_dependencies=True,
240+
force=options.get("force"),
241+
)
242+
_install_project_private_library_deps(pkg, private_lm, env_lm, options)
243+
244+
226245
def _install_project_env_custom_libraries(project_env, options):
227246
already_up_to_date = not options.get("force")
228247
config = ProjectConfig.get_instance()

platformio/package/manager/_install.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def _install(
117117

118118
def install_dependencies(self, pkg, print_header=True):
119119
assert isinstance(pkg, PackageItem)
120-
dependencies = dependencies = self.get_pkg_dependencies(pkg)
120+
dependencies = self.get_pkg_dependencies(pkg)
121121
if not dependencies:
122122
return
123123
if print_header:

tests/commands/pkg/test_install.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -219,22 +219,37 @@ def test_private_lib_deps(clirunner, validate_cliresult, isolated_pio_core, tmp_
219219
"""
220220
)
221221
with fs.cd(str(project_dir)):
222+
config = ProjectConfig()
223+
224+
# some deps were added by user manually
225+
result = clirunner.invoke(
226+
package_install_cmd,
227+
[
228+
"-g",
229+
"--storage-dir",
230+
config.get("platformio", "lib_dir"),
231+
"-l",
232+
"paulstoffregen/OneWire@^2.3.5",
233+
],
234+
)
235+
validate_cliresult(result)
236+
237+
# ensure all deps are installed
222238
result = clirunner.invoke(package_install_cmd)
223239
validate_cliresult(result)
224-
config = ProjectConfig()
225-
installed_lib_pkgs = LibraryPackageManager(
226-
os.path.join(config.get("platformio", "lib_dir"))
240+
installed_private_pkgs = LibraryPackageManager(
241+
config.get("platformio", "lib_dir")
227242
).get_installed()
228-
assert pkgs_to_specs(installed_lib_pkgs) == [
229-
PackageSpec("My Private Lib@1.0.0")
243+
assert pkgs_to_specs(installed_private_pkgs) == [
244+
PackageSpec("OneWire@2.3.6"),
245+
PackageSpec("My Private Lib@1.0.0"),
230246
]
231-
installed_libdeps_pkgs = LibraryPackageManager(
247+
installed_env_pkgs = LibraryPackageManager(
232248
os.path.join(config.get("platformio", "libdeps_dir"), "private")
233249
).get_installed()
234-
assert pkgs_to_specs(installed_libdeps_pkgs) == [
250+
assert pkgs_to_specs(installed_env_pkgs) == [
235251
PackageSpec("ArduinoJson@6.19.3"),
236252
PackageSpec("DallasTemperature@3.9.1"),
237-
PackageSpec("OneWire@2.3.6"),
238253
]
239254

240255

0 commit comments

Comments
 (0)