我試圖使用一個函數作爲defproject
表單中:profiles
鍵的值。從一個新項目開始(lein new app test
)這工作正常:Dynamic leiningen:profiles
:profiles {}
(你可能希望!)。但是,如果我將其更改爲:
:profiles (merge {})
然後當我運行lein repl
它爆炸:
Caused by: java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to java.util.Map$Entry
我很困惑這個,因爲如果我設置:profiles
回空的地圖,並要求這些REPL事情是平等的:
test.core=> (= {} (merge {}))
true
我的誤解在哪裏?我錯過了一些基本的東西?這是一個不幸的defproject
宏的神器嗎?還有別的嗎?
(Clojure的1.8.0,2.7.1 leiningen,JAVA 1.8.0_102)
編輯 - 斯科特的回答工作液:所以現在
(def project-name 'myproj)
(def mains ["foo" "bar"])
...
(defn- lein-alias [main]
{ main ["with-profile" main] })
(defn- lein-profile [main]
(let [jar (str main ".jar")
entry `~(str project-name "." main)]
{(keyword main) {:main entry :bin {:name main} :jar-name jar :uberjar-name jar}}))
(defproject project-name "0.1.0"
...
:profiles ~(apply merge (concat (map lein-profile mains) {:uberjar {:aot :all}}))
:aliases ~(apply merge (map lein-alias mains))
...
我可以lein foo bin
和lein bar bin
我的心臟的內容。
嘗試unquoting吧'〜(合併{})' – Scott
@Scott,工程。但爲什麼? –