Clojure 我可以在REPL中查找Lein项目中的内容吗?

Clojure 我可以在REPL中查找Lein项目中的内容吗?,clojure,leiningen,Clojure,Leiningen,假设我有一个普通的项目 (defproject myservice "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :mailing-list {:name "myservice@example.com" :post "myservice@climate.com"} :license {:name "Eclipse Public License"

假设我有一个普通的项目

(defproject myservice "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :mailing-list {:name "myservice@example.com" :post "myservice@climate.com"}
  :license {:name "Eclipse Public License"
            :url  "http://www.eclipse.org/legal/epl-v10.html"}

  :dependencies [[org.clojure/clojure "1.6.0"]
                 [ring/ring-core "1.4.0"]
                 [ring/ring-jetty-adapter "1.4.0"]
                 [compojure "1.4.0"]
                 [ring/ring-defaults "0.1.5"]
                 [org.clojure/tools.logging "0.3.1"]
                 [clj-http "2.0.0"]]

  :plugins [[lein-ring "0.9.7"]]

  :ring {:handler myservice.core/standalone-app
         :port 3000}
  :profiles {
             :uberjar {:ring {:handler myservice.core/app}}}
  )
lein repl
中,我可以从project.clj中查找值吗?怎么用?当然,我的盲目黑客没用

user=> (:mailing-list project)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: project in this context, compiling:(/private/var/folders/1g/fnytl2x93sx6hp2f1rsf4h1r5xtqv_/T/form-init6671981825845237047.clj:1:1)
接下来的问题是,我可以在project.clj中进一步使用项目地图中的内容吗?比如,如果我想把邮件列表取出来,然后把它替换成:deb:maintainer

:deb 
  {:toDir "target"
   :package "mysevice"
   :maintainer {:name "Meeples", :email "myservice@example.com"}
   ...
  }

我相信你能看出来,我对这个有点陌生,但是project.clj只是可执行的Clojure,不是吗?如果我知道项目地图的名称,我应该能够查询它,对吗?

这是莱宁根的相关行:


给定名称空间是
leiningen.core.project
,映射应该在它下面。

您可以像通常那样
def
数据,并使用
~

(def mailing-list {:name "myservice@example.com" :post "myservice@climate.com"})

(defproject myservice "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :mailing-list ~mailing-list
  :license {:name "Eclipse Public License"
            :url  "http://www.eclipse.org/legal/epl-v10.html"}

  :dependencies [[org.clojure/clojure "1.6.0"]
                 [ring/ring-core "1.4.0"]
                 [ring/ring-jetty-adapter "1.4.0"]
                 [compojure "1.4.0"]
                 [ring/ring-defaults "0.1.5"]
                 [org.clojure/tools.logging "0.3.1"]
                 [clj-http "2.0.0"]]

  :plugins [[lein-ring "0.9.7"]]

  :ring {:handler myservice.core/standalone-app
         :port 3000}
  :profiles {
             :uberjar {:ring {:handler myservice.core/app}}}
  :deb {
        :toDir "target"
        :package "mysevice"
        :maintainer {:name "Meeples", :email (:name ~mailing-list)}})

实际上,因为
defproject
是一个宏,所以它将在调用站点的名称空间中创建
project
,我们不确定这一点of@acron有趣的是,我没有意识到这一点。再多挖掘一点代码^^这不是答案,但提供了两种可能适用于您的用例的解决方案,例如slurping the project.clj或
def
-提取您感兴趣的部分.Hmmm。这不是那么简单,是吗?我想我应该问另一个问题。我真正想做的是从:邮件列表映射中提取一个值,并将其用作:deb,:maintainer中的:email值。哦,在这种情况下,您可以
def
东西-让我做一个正确的回答,2秒钟。