project.clj действительно не знает, где искать foo / defproject. Так что, если вы на репле, вы можете сделать
user> (in-ns 'foo)
foo> (read-project "project.clj")
Это запустит код из project.clj внутри пространства имен foo, где определен defproject. Или вы можете поместить (in-ns 'foo) в project.clj. Результат будет таким же.
Но вы также можете написать что-то подобное в project.clj:
(foo/defproject ...)
Это вызовет defproject внутри вашего текущего пространства имен при запуске (foo / read-project "project.clj").
обновление
из test_uberjar.clj:
(def project (binding [*ns* (the-ns 'leiningen.core)]
(read-project "test_projects/sample_no_aot/project.clj")))
из test_deps.clj:
(:use [leiningen.core :only [read-project defproject]] ...)
Таким образом, defproject всегда доступен при загрузке файла.