建立一个基于构建平台需要不同依赖关系的leiningen项目的优雅方法是什么?

时间:2011-01-14 05:52:13

标签: clojure cross-platform leiningen

为了进行一些多平台的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使用哪个项目描述符。

建立这样一个环境的其他(最好是更优雅)方法是什么?

1 个答案:

答案 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))