Подтвердить что ты не робот

Каков элегантный способ настройки проекта leiningen, который требует разных зависимостей на основе платформы построения?

Чтобы сделать несколько многоплатформенных графических интерфейсов, я только что переключился с GTK + Clojure (потому что похоже, что привязки Java для GTK никогда не были перенесены в Windows) в SWT + Clojure. До сих пор так хорошо, что я получил убержар, созданный для Linux.

Уловка заключается в том, что я хочу создать uberjar для Windows, и я пытаюсь найти чистый способ управления файлом project.clj.

Сначала мне показалось, что я должен установить classpath для указания на SWT-библиотеки, а затем построить uberjar. Это потребует, чтобы я установил путь к классам SWT-библиотек перед запуском jar, но мне, вероятно, понадобится запускать script. Однако leiningen, кажется, игнорирует classpath в этом случае, потому что он всегда сообщает, что

В настоящее время 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. Если я хочу сделать uberjar для Windows, я должен зависеть от org.eclipse/swt-win32-win32-x86, а другой для x86-64 и т.д. И т.д.

Мое текущее решение - просто создать отдельную ветвь для каждой среды сборки с другим project.clj. Это похоже на использование полу для доставки одного галлона молока, но я использую базар для контроля версий, поэтому разветвление и повторная интеграция просты. Может быть, лучший способ - иметь project.linux.clj, project.win32.clj и т.д., Но я не вижу никакого способа сказать leiningen, какой дескриптор проекта использовать.

Какие другие (желательно более элегантные) способы настройки такой среды?

4b9b3361

Ответ 1

Здесь довольно элегантное решение, использующее свойства 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))