Skip to content

Instantly share code, notes, and snippets.

@lrenn
Created August 26, 2010 05:48
Show Gist options
  • Save lrenn/550888 to your computer and use it in GitHub Desktop.
Save lrenn/550888 to your computer and use it in GitHub Desktop.
;;; ant/xml way
;;; supports :transitive true/false and :conf "configuration/scope".
;;; This is obviously pretty basic...
(ns cake.tasks.ivy
(:use cake cake.ant clojure.contrib.prxml
[clojure.java.io :only [writer]]
[cake.project :only [group]])
(:import [java.io File]
[org.apache.tools.ant.taskdefs Copy Delete ExecTask Move]
[org.apache.ivy.ant IvyConfigure IvyResolve IvyRetrieve IvyDeliver IvyPublish]
[org.apache.ivy.plugins.parser.xml XmlModuleDescriptorParser]
[org.apache.ivy.plugins.resolver IBiblioResolver]))
(def *repositories*
[["clojure" "http://build.clojure.org/releases"]
["clojure-snapshots" "http://build.clojure.org/snapshots"]
["clojars" "http://clojars.org/repo/"]])
(defn make-resolver
"Creates a maven compatible ivy resolver from a lein/cake repository."
[[id url]]
(doto (IBiblioResolver.)
(.setRoot url)
(.setName id)
(.setM2compatible true)))
(defn add-resolvers
"Adds default and project repositories."
[settings project]
(let [chain (.getResolver settings "main")]
(doseq [r (map make-resolver (concat *repositories*
(:repositories project)))]
(.setSettings r settings)
(.addResolver settings r)
(.add chain r))))
(defn exclusion
[dep]
[:exclude {:org (group dep) :name (name dep)}])
(defn dependencies
[deps default-conf]
(for [[dep version & opts] deps :let [opts (apply array-map opts)]]
[:dependency
(merge {:org (group dep) :name (name dep) :rev version
:conf (or (:conf opts) default-conf)}
(select-keys opts [:transitive]))
(map exclusion (:exclusions opts))]))
(defn make-ivy
[project]
(with-open [out (writer "ivy.xml")]
(binding [*prxml-indent* 2
*out* out]
(prxml [:ivy-module {:version "2.0"}
[:info {:organisation (:group-id project) :module (:name project) :revision (:version project)}]
[:configurations
[:conf {:name "master" :visibility "public"}]
[:conf {:name "compile" :visibility "public"}]
[:conf {:name "develop" :visibility "private"}]]
[:dependencies
(dependencies (:dependencies project) "compile->default")
(dependencies (:dev-dependencies project) "develop->default")]]))))
(deftask resolve
(let [configure-task (ant IvyConfigure {})
settings (.getReference *ant-project* "ivy.instance")
ivy (.getConfiguredIvyInstance settings configure-task)]
(add-resolvers (.getSettings ivy) *project*))
(make-ivy *project*)
(ant IvyResolve {}))
(deftask deps #{resolve}
"Fetch dependencies using ivy."
(ant IvyRetrieve {:conf "compile" :pattern (str "build/lib" "/[artifact]-[revision].[ext]")})
(ant IvyRetrieve {:conf "develop" :pattern (str "build/lib/dev" "/[artifact]-[revision].[ext]")})
;; I think we could just set sync to true and not have to delete/copy.
(ant Delete {:dir "lib"})
(ant Move {:file "build/lib" :tofile "lib" :verbose true}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment