ビルドプラットフォームに基づいて異なる依存関係を必要とするLeiningenプロジェクトを設定するエレガントな方法は何ですか?

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

質問

マルチプラットフォームのGUI開発を行うために、GTK + Clojure(GTKのJavaバインディングがWindowsに移植されなかったように見えるため)からSWT + Clojureに切り替えました。これまでのところ、Linuxのために建てられたUberjarを手に入れたので、とても良いことです。

しかし、キャッチは、Windows用のUberjarを構築したいということであり、Project.cljファイルを管理するためのクリーンな方法を見つけようとしています。

最初は、SWTライブラリを指すようにClassPathを設定し、Uberjarを構築すると思いました。これには、JARを実行する前にSWTライブラリにClassPathを設定する必要がありますが、とにかくランチャースクリプトが必要になる可能性があります。ただし、この場合は、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、もう1つはx86-64などに依存する必要があります。

私の現在の解決策は、異なるProject.cljを使用して、ビルド環境ごとに別のブランチを作成することです。これはちょっとセミを使用して1ガロンの牛乳を配達するようなようですが、バージョンコントロールに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))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top