2011-01-14 25 views
12

Để làm một số phát triển GUI đa nền tảng, tôi vừa chuyển từ GTK + Clojure (vì có vẻ như các ràng buộc Java cho GTK không bao giờ được chuyển sang Windows) sang SWT + Clojure. Cho đến nay, tốt đến mức tôi đã có một uberjar được xây dựng cho Linux.Cách thanh lịch để thiết lập dự án leiningen yêu cầu các phụ thuộc khác nhau dựa trên nền tảng xây dựng là gì?

Việc nắm bắt, mặc dù, là tôi muốn xây dựng một uberjar cho Windows và tôi đang cố gắng tìm ra một cách rõ ràng để quản lý tệp project.clj.

Lúc đầu, tôi nghĩ rằng tôi sẽ đặt classpath để trỏ đến các thư viện SWT và sau đó xây dựng uberjar. Điều này sẽ yêu cầu tôi thiết lập một classpath cho các thư viện SWT trước khi chạy jar, nhưng tôi có thể sẽ cần một kịch bản trình khởi chạy. Tuy nhiên, leiningen dường như bỏ qua classpath trong trường hợp này vì nó luôn luôn báo cáo rằng

Hiện nay, project.clj trông như thế này đối với tôi:

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

Dòng có liên quan là org.eclipse/swt-gtk dòng -linux-x86. Nếu tôi muốn tạo một uberjar cho Windows, tôi phải phụ thuộc vào org.eclipse/swt-win32-win32-x86 và một cái khác cho x86-64, v.v.

Giải pháp hiện tại của tôi là tạo một nhánh riêng biệt cho từng môi trường xây dựng với một project.clj khác. Điều này có vẻ giống như sử dụng một bán để cung cấp một gallon sữa, nhưng tôi đang sử dụng bazaar để kiểm soát phiên bản, do đó, phân nhánh và tích hợp lặp đi lặp lại rất dễ dàng. Có lẽ cách tốt hơn là có project.linux.clj, project.win32.clj, v.v. nhưng tôi không thấy bất kỳ cách nào để báo cho leiningen biết nên sử dụng bộ mô tả dự án nào.

Cách nào khác (tốt hơn là thanh lịch) để thiết lập môi trường như vậy?

+0

Như đã chỉ ra bởi technomancy, giải pháp của tôi là không thực sự giải quyết vấn đề của bạn cuối cùng. Tôi đã không đọc câu hỏi của bạn một cách chính xác và tôi nghĩ rằng bạn không nên chấp nhận câu trả lời của tôi. –

+0

Trả lời các câu hỏi ngẫu nhiên chắc chắn không phải là tách trà của tôi, tôi chỉ nên gắn mã hóa! ;-) –

Trả lời

16

Dưới đây là một giải pháp khá thanh lịch sử dụng thuộc tính hệ thống 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)) 
+0

Ồ, điều đó chắc chắn sẽ làm được điều này! Bạn có thể giải thích, mặc dù, ~ trong dòng "~ swt]"? Tôi thấy rằng nó unquotes trong vĩ mô, nhưng tôi nghĩ bạn chỉ cần báo giá và unquote trong phong cách đó khi viết một vĩ mô. –

+0

Đó là bởi vì defproject là một macro và nội bộ nó đánh giá đúng cách các biểu thức unquoted bằng cách sử dụng hàm 'unquote-project' riêng: http://bit.ly/gOZriZ –

+0

Đừng quên chấp nhận câu trả lời! –

Các vấn đề liên quan