建立一个基于构建平台需要不同依赖性的Leiningen项目的优雅方法是什么?
-
11-10-2019 - |
题
为了进行一些多平台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))
不隶属于 StackOverflow