Created
August 26, 2010 05:48
-
-
Save lrenn/550888 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;; 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