Я пытаюсь использовать функцию в качестве значения для ключа :profiles
в форме defproject
. Начиная от свежего проекта (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, ява 1.8.0_102)
Edit - рабочий раствор с ответом Скотт:
(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, что работает. Но почему? –