为了进行一些多平台的GUI开发,我刚刚从GTK + Clojure(因为看起来GTK的Java绑定从未被移植到Windows)切换到SWT + Clojure。到目前为止,非常好,因为我已经为Linux构建了一个uberjar。
但问题是,我想为Windows构建一个uberjar,我正试图想出一个管理project.clj文件的简洁方法。
起初,我以为我会将类路径设置为指向SWT库,然后构建uberjar。这需要我在运行jar之前设置一个类路径到SWT库,但无论如何我可能需要一个启动器脚本。但是,leiningen似乎忽略了此实例中的类路径,因为它始终报告
目前,project.clj对我来说是这样的:
(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)
相关的行是org.eclipse / swt-gtk-linux-x86行。如果我想为Windows制作一个uberjar,我必须依赖org.eclipse / swt-win32-win32-x86,另一个用于x86-64,依此类推。
我目前的解决方案是使用不同的project.clj为每个构建环境创建一个单独的分支。这似乎有点像使用半成品来提供一加仑牛奶,但我使用集市进行版本控制,因此分支和重复集成很容易。也许更好的方法是有一个project.linux.clj,project.win32.clj等,但我没有看到任何方法告诉leiningen使用哪个项目描述符。
建立这样一个环境的其他(最好是更优雅)方法是什么?
答案 0 :(得分:17)
这是一个使用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))