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

StackOverflow https://stackoverflow.com/questions/4688336

为了进行一些多平台GUI开发,我刚刚从GTK + Clojure切换(因为它看起来像GTK的Java绑定从未移植到Windows上)到SWT + Clojure。到目前为止,一切都很好,以至于我已经为Linux建造了Uberjar。

但是,我想为Windows构建一个Uberjar,我正在尝试找出一种管理Project.Clj文件的干净方法。

起初,我以为我会将class路径指向SWT库,然后构建Uberjar。这将要求我在运行JAR之前将Class Path设置为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等,但是我看不到任何方法告诉莱宁根使用哪个项目描述符。

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

有帮助吗?

解决方案

这是使用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))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top