【问题标题】:Can I lookup things within a Lein Project in the REPL?我可以在 REPL 的 Lein 项目中查找内容吗?
【发布时间】:2015-12-15 02:03:32
【问题描述】:

假设我有一个 vanilla project.clj 之类的

(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 中进一步使用项目地图中的内容吗?就像我想拉出那个邮件列表 :name 并将其替换为 :deb :maintainer 一样?

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

我敢肯定你会说,我对此有点陌生,但 project.clj 只是可执行的 Clojure,不是吗?如果我知道项目的地图名称,应该可以查询到了吧?

【问题讨论】:

  • 这不是一个答案,但this thread 提供了一些可能适用于您的用例的解决方案,例如 slurping project.clj 或 def - 找出您正在使用的部分有兴趣。
  • 嗯。这不是那么简单,不是吗?我想我应该问一个不同的问题。我真正想做的是从 :mailing-list 映射中提取一个值,并将其用作 :deb, :maintainer 中的 :email 值。
  • 哦,在这种情况下你可以def 东西 - 让我做一个正确的答案,2 秒。

标签: clojure leiningen


【解决方案1】:

您可以像往常一样使用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)}})

【讨论】:

    【解决方案2】:

    这是 leiningen 中的相关行:https://github.com/technomancy/leiningen/blob/b29b2ea41b6d177a8a57493b979164eab0931e4d/leiningen-core/src/leiningen/core/project.clj#L405

    给定命名空间是leiningen.core.project,地图应该在它下面。

    【讨论】:

    • 其实因为defproject是一个宏,所以它会在调用站点的命名空间中创建project...我们不确定
    • @acron 有趣,我不知道这一点。更多代码挖掘然后^^
    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多