Каков элегантный способ настроить проект leiningen, который требует различных зависимостей в зависимости от платформы сборки? - PullRequest
13 голосов
/ 14 января 2011

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

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

Сначала я решил установить classpath, чтобы он указывал на библиотеки SWT, а затем создал Uberjar. Это потребовало бы, чтобы я установил classpath для библиотек SWT перед запуском jar, но в любом случае мне, вероятно, понадобится скрипт запуска. Однако в этом случае 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, какой дескриптор проекта использовать.

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

1 Ответ

17 голосов
/ 14 января 2011

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