Ce qui est une façon élégante de mettre en place un projet de Leiningen qui nécessite différentes dépendances basées sur la plate-forme de construction?

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

Question

Pour faire un peu de développement GUI multi-plate-forme, je viens de commutation GTK + Clojure (car il semble que les liaisons Java pour GTK ne se est jamais porté sur Windows) pour SWT + Clojure. Jusqu'à présent, si bon que je l'ai obtenu un uberjar construit pour Linux.

Le hic, cependant, est que je veux construire un uberjar pour Windows et je suis en train de trouver un moyen propre pour gérer le fichier project.clj.

Au début, je pensais que je mettrais le classpath pour pointer vers les bibliothèques SWT puis construire le uberjar. Il faudrait pour cela que je mis un classpath aux bibliothèques SWT avant de lancer le pot, mais je aurait probablement besoin d'un script de lancement, de toute façon. Cependant, Leiningen semble ignorer le chemin de classe dans ce cas, car il signale toujours que

À l'heure actuelle, ressemble project.clj comme ça pour moi:

(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)

La ligne pertinente est la org.eclipse / ligne SWT-gtk-linux-x86. Si je veux faire un uberjar pour Windows, je dois compter sur org.eclipse / SWT-win32-win32-x86, et un autre pour x86-64, et ainsi de suite et ainsi de suite.

Ma solution actuelle est de créer simplement une branche distincte pour chaque environnement de construction avec un autre project.clj. Cela semble un peu comme utiliser un demi pour délivrer un seul gallon de lait, mais je me sers pour le contrôle bazar version, ramifient ainsi et intégrations répétées sont faciles. Peut-être la meilleure façon est d'avoir un project.linux.clj, project.win32.clj, etc, mais je ne vois pas de façon de dire Leiningen quel descripteur du projet d'utilisation.

Quels sont les autres moyens (de préférence plus élégant) pour mettre en place un tel environnement?

Était-ce utile?

La solution

Voici une solution tout à fait élégante en utilisant les propriétés du système 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))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top