ビルドプラットフォームに基づいて異なる依存関係を必要とするLeiningenプロジェクトを設定するエレガントな方法は何ですか?
-
11-10-2019 - |
質問
マルチプラットフォームの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))