14

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

ただし、問題は、Windows用のuberjarを作成したいということであり、project.cljファイルを管理するためのクリーンな方法を見つけようとしています。

最初は、SWTライブラリを指すようにクラスパスを設定してから、uberjarをビルドすることを考えました。これには、jarを実行する前にSWTライブラリへのクラスパスを設定する必要がありますが、とにかく、ランチャースクリプトが必要になる可能性があります。ただし、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あり、別のuberjarをに依存する必要がx86-64あります。

私の現在の解決策は、ビルド環境ごとに異なるブランチを作成することproject.cljです。これは、セミを使用して1ガロンのミルクを提供するようなものですが、バージョン管理にバザールを使用しているため、分岐と繰り返しの統合が簡単です。project.linux.clj、、などを使用するのがより良い方法かもしれproject.win32.cljませんが、どのプロジェクト記述子を使用するかをleiningenに指示する方法がわかりません。

そのような環境を設定する他の(できればよりエレガントな)方法は何ですか?

4

1 に答える 1

18

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))
于 2011-01-14T15:26:25.797 に答える