diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 4bd1280ad..2d83af983 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1972,6 +1972,14 @@ std::ostream & operator << (std::ostream & str, const ExternalValueBase & v) {
 
 EvalSettings evalSettings;
 
+EvalSettings::EvalSettings()
+{
+    if (flakeRegistry == "")
+        // FIXME: static initialization order fiasco. But this will go
+        // away when we switch to an online registry.
+        flakeRegistry = settings.nixDataDir + "/nix/flake-registry.json";
+}
+
 static GlobalConfig::Register r1(&evalSettings);
 
 
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 44988cd70..b0bf777fc 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -367,6 +367,11 @@ struct EvalSettings : Config
 
     Setting<Strings> allowedUris{this, {}, "allowed-uris",
         "Prefixes of URIs that builtin functions such as fetchurl and fetchGit are allowed to fetch."};
+
+    Setting<std::string> flakeRegistry{this, "", "flake-registry",
+        "Path or URI of the global flake registry."};
+
+    EvalSettings();
 };
 
 extern EvalSettings evalSettings;
diff --git a/src/libexpr/primops/flake.cc b/src/libexpr/primops/flake.cc
index 89267e2b1..f73ab4424 100644
--- a/src/libexpr/primops/flake.cc
+++ b/src/libexpr/primops/flake.cc
@@ -126,8 +126,7 @@ void writeLockFile(const LockFile & lockFile, const Path & path)
 
 std::shared_ptr<FlakeRegistry> getGlobalRegistry()
 {
-    Path registryFile = settings.nixDataDir + "/nix/flake-registry.json";
-    return readRegistry(registryFile);
+    return readRegistry(evalSettings.flakeRegistry);
 }
 
 Path getUserRegistryPath()