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 REQUIRE → Project.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`"))
FileIOdeclaresPkgin[deps]and doesusing Pkginsrc/FileIO.jl, but no non-deprecated code path uses it. EveryPkg.*call site (src/deprecated.jl:50-67) lives in the legacyadd_loader/add_savermethods 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 inheritsPkginto its closure and pays for it atusingtime.The dependency dates to
0336017(June 2019, theREQUIRE→Project.tomlmigration), whenPkg.installed()andPkg.addwere used to detect and install missing backends. Both uses are long gone; the live path loads backends withBase.requireinsrc/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_packagereturnsnothing— i.e. the package isn't a direct dep of the active project — but thePkgIdit builds is then handed toBase.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
requirelater. That's a lot of machinery, plus a stdlib in every downstream closure, for a case callers can handle by passingname => uuid— which the non-deprecated API already asks for.Option A — lazy load (non-breaking, 1.x)
Drop
using Pkgand the[deps]entry; load on demand inside the deprecated method, which has already emitted adepwarnby that point: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_packageandMainonly, and when both fail throw something actionable: