Mathlib Manual

2.3. Using local dev version of a dependency

(written by Jon Eugster)

This tip should be considered a workaround, some care is adviced when trying this non-standard setup!

Note: Things here might change as lake is being developed, as features described here are not necessarily officially supported by lake. This file has been written for Lean v4.16.0. If in doubt, ask for help on Zulip.

In rare circumstances you might want to use a local copy of a dependency (e.g. mathlib) when developing, i.e. to test changes immediately.

You could do this by using a local dependency while developing

require mathlib from ".." / "mathlib4"

and then change it back to the remote dependency before pushing changes:

require "leanprover-community" / "mathlib"

However, if you want to do this frequently, here might be a better setup. With the suggested modifications to the lakefile.lean below, you get the following behaviour:

  • To use the local dependency, call

    lake update -R -Kmathlib.useDev mathlib
    
  • To switch back to the remote dependency, call

    lake update -R mathlib
    
  • Anybody require-ing your project as dependency in there own project will automatically get the remote version of the dependencies.

(Note: make sure to read the chapter above about specifying versions when using lake update).

For this you need to replace require "leanprover-community" / "mathlib" in your lakefile.lean with the following instructions:

open Lake DSL

/-- The local dependency. Using a relative path. -/
def LocalMathlib : Dependency where
  name := `mathlib
  src? := some <| .path (".." / "mathlib4")
  scope := ""
  version? := none
  opts := {}

/--
The remote dependency. Note that "master" is the tag/branch
you want to clone from.
-/
def RemoteMathlib : Dependency where
  name := `mathlib
  /-
  You can also write `src? := none` to get the package
  from Reservoir instead (if `scope` is specified
  correctly), or you can replace `"master"` with
  `none` to not specify the input branch/tag.
  -/
  src? := some <| .git
    "https://github.com/leanprover-community/mathlib4.git"
    "master" none
  scope := "leanprover-community"
  version? := none
  opts := {}


/-
Choose `mathlib` dependency locally if
`-Kmathlib.useDev` is provided.
-/
open Lean in
#eval (do
  let depName :=
    if get_config? mathlib.useDev |>.isSome then
      ``LocalMathlib else ``RemoteMathlib
  modifyEnv (fun env =>
    Lake.packageDepAttr.ext.addEntry env depName)
  : Elab.Command.CommandElabM Unit)