tutorial code clojure cross-platform leiningen

code - clojure tutorial



¿Cuál es una manera elegante de configurar un proyecto de Leiningen que requiere diferentes dependencias basadas en la plataforma de compilación? (1)

Aquí hay una solución bastante elegante que usa las propiedades del sistema Java:

(let [properties (select-keys (into {} (System/getProperties)) ["os.arch" "os.name"]) platform (apply format "%s (%s)" (vals properties)) swt (case platform "Windows XP (x86)" ''[org.eclipse/swt-win32-win32-x86 "3.5.2"] "Linux (x86)" ''[org.eclipse/swt-gtk-linux-x86 "3.5.2"])] (defproject alyra.mana-punk/character "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.2.0"] [org.clojure/clojure-contrib "1.2.0"] ~swt] :main alyra.mana-punk.character.core))

Para hacer un poco de desarrollo de GUI multiplataforma, acabo de cambiar de GTK + Clojure (porque parece que los enlaces de Java para GTK nunca se transfirieron a Windows) a SWT + Clojure. Hasta ahora, es tan bueno que obtuve un uberjar para Linux.

El truco, sin embargo, es que quiero construir un uberjar para Windows y estoy tratando de encontrar una manera limpia de administrar el archivo project.clj.

Al principio, pensé que establecería el classpath para apuntar a las bibliotecas SWT y luego construir el uberjar. Esto requeriría que estableciera un classpath para las bibliotecas de SWT antes de ejecutar el jar, pero de todos modos necesitaría un script de iniciador. Sin embargo, leiningen parece ignorar el classpath en este caso porque siempre informa que

Actualmente, project.clj se parece a esto para mí:

(defproject alyra.mana-punk/character "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.2.0"] [org.clojure/clojure-contrib "1.2.0"] [org.eclipse/swt-gtk-linux-x86 "3.5.2"]] :main alyra.mana-punk.character.core)

La línea relevante es la línea org.eclipse / swt-gtk-linux-x86. Si quiero hacer un uberjar para Windows, tengo que depender de org.eclipse / swt-win32-win32-x86, y otro para x86-64, y así sucesivamente.

Mi solución actual es simplemente crear una rama separada para cada entorno de construcción con un proyecto diferente .clj. Esto parece un poco como usar un semi para entregar un solo galón de leche, pero estoy usando bazar para el control de versiones, por lo que las ramificaciones y las integraciones repetidas son fáciles. Quizás la mejor manera es tener un project.linux.clj, project.win32.clj, etc., pero no veo ninguna forma de decirle a leiningen qué descriptor de proyecto usar.

¿Cuáles son otras formas (preferiblemente más elegantes) de configurar ese entorno?