JuliaIO / JuliaIO/FileIO.jl

Drop the hard `Pkg` dependency

Open
#446 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Julia
Stars
228
Forks
81
Avg merge
1d 29m
Merged PRs (30d)
1

Description

FileIO declares Pkg in [deps] and does using Pkg in src/FileIO.jl, but no non-deprecated code path uses it. Every Pkg.* call site (src/deprecated.jl:50-67) lives in the legacy add_loader/add_saver methods that are already marked # TODO: delete this method in FileIO v2. Since FileIO sits near the root of a large part of the ecosystem's dependency graph, every downstream package inherits Pkg into its closure and pays for it at using time.

The dependency dates to 0336017 (June 2019, the REQUIREProject.toml migration), when Pkg.installed() and Pkg.add were used to detect and install missing backends. Both uses are long gone; the live path loads backends with Base.require in src/loadsave.jl:203, which is pure Base.

The registry fallback is nearly unreachable

The remaining block resolves a package name to a UUID by scanning the installed registries, across three version-dependent branches. It only runs when Base.identify_package returns nothing — i.e. the package isn't a direct dep of the active project — but the PkgId it builds is then handed to Base.require, which needs the package in the load path anyway.

So it can only help when the package is an indirect dep: in the manifest, not a direct dep. Otherwise it either finds nothing or finds a UUID that fails at require later. That's a lot of machinery, plus a stdlib in every downstream closure, for a case callers can handle by passing name => uuid — which the non-deprecated API already asks for.

Option A — lazy load (non-breaking, 1.x)

Drop using Pkg and the [deps] entry; load on demand inside the deprecated method, which has already emitted a depwarn by that point:

const PKG_UUID = UUID("44cfe95a-1eb2-52ea-b672-e2afdf69b78f")
_load_pkg() = Base.require(Base.PkgId(PKG_UUID, "Pkg"))

and access Pkg.API.Context() etc. through the returned module. Identical behaviour for anyone on the deprecated path; everyone else stops paying.

Option B — delete the lookup (v2)

Resolve via Base.identify_package and Main only, and when both fail throw something actionable:

throw(ArgumentError("could not resolve package \"$pkgname\" from the active environment; " *
                    "pass it as a Module or as `\"$pkgname\" => uuid`"))

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Read the dependency declaration and using Pkg in src/FileIO.jl, then inspect the deprecated call sites in src/deprecated.jl:50-67 and the live loading path at src/loadsave.jl:203. The issue presents two alternatives, so first confirm which direction maintainers want. Done means the unnecessary dependency is removed without breaking the supported non-deprecated path, with deprecated behavior handled according to the chosen option.

Written by the indexing model from the issue text.

Assessment

Tech stack
julia
Domain
tooling
Issue type
Refactor
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.