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

标签 clojure cross-platform leiningen

为了进行一些多平台 GUI 开发,我刚刚从 GTK + Clojure(因为看起来 GTK 的 Java 绑定(bind)从未移植到 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 .这似乎有点像使用半成品来提供一加仑牛奶,但我使用 bazaar 进行版本控制,因此分支和重复集成很容易。也许更好的方法是拥有 project.linux.clj , project.win32.clj等,但我看不到任何方法可以告诉 leiningen 使用哪个项目描述符。

还有什么其他(最好更优雅)的方式来设置这样的环境?

最佳答案

这是一个使用 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))

关于clojure - 建立需要基于构建平台的不同依赖项的 leiningen 项目的优雅方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4688336/

相关文章:

clojure - 使用可选键进行 defrecord

emacs - 如何在苹果酒中正确使用 lein try?

macos - Clojure 的 Emacs CIDER repl - .profile 中的环境变量丢失

list - Clojure - 嵌套列表中的对

debugging - 如何检查GDB中函数的返回值?

java - 如何处理不同计算机之间的 Java 2D 性能差异?

java - 如何/可以使用 GCJ 编译 Clojure

clojure - 如何在启动repl时默认加载ns

Clojure: map map

sql-server - 如何在flutter中连接easypaisa/jazzcash支付网关?