2012-04-22 28 views
12

Tôi nghĩ (xem bên dưới) rằng tôi muốn cấu trúc một dự án Clojure như nhiều mô-đun, với các phụ thuộc theo thứ tự - giống như Maven cho phép tôi làm với multi-modules projects.Cách tốt nhất để cấu trúc và xây dựng ứng dụng Clojure có plugin?

Nhưng tôi không thể xem cách làm điều này với Leiningen - tất cả những gì tôi có thể thấy là sửa lỗi checkouts được mô tả trong FAQ không có vẻ mạnh mẽ.

Lein sẽ làm điều này? Tôi có nên sử dụng Gradle thay thế không? Hay là loại điều này không cần thiết?

Một số ngữ cảnh khác: Tôi tự hỏi làm thế nào để kiến ​​trúc một ứng dụng mô-đun hỗ trợ các plugin (mà tôi tưởng tượng có nghĩa là các lọ được đổ trên đường dẫn lớp). Và tôi tự hỏi mức độ nào tôi có thể cấu trúc đó như là một plugin cốt lõi + (tôi đang nghĩ rằng tôi sẽ có thể làm điều gì đó với Clojure's dynamic code loading và không phải đi với Java/OSGi). Vì vậy, tôi đoán động cơ thúc đẩy cho dự án đơn xuất phát từ mong muốn một số cách đóng gói mọi thứ (lõi + plugin mặc định) dưới dạng một đốm màu đơn giản cho người dùng cuối, nhưng cũng có thể được chia được xây dựng và thử nghiệm trong các phân đoạn, kiểm tra tính độc lập hợp lý của mỗi mô-đun). lời khuyên tổng quát về vấn đề này được hoan nghênh

Cập nhật

Một giải pháp khả thi mà không được đề cập dưới đây được sử dụng một Maven plugin - Tôi cho rằng hỗ trợ tất cả mọi thứ Maven có, nhưng biên dịch Clojure, vì vậy sẽ làm việc với các module lồng nhau , vv

Trả lời

9

Đầu tiên, có vẻ như Leiningen không hỗ trợ phân cấp mô-đun như Maven. Các checkouts là điều gần nhất tiếp theo nó có. Nó sẽ là đủ mặc dù để phát triển một ứng dụng mô-đun trong Clojure mặc dù.

Đối với cấu trúc dự án, tôi sẽ có một dự án API, một dự án "cốt lõi", bản thân các plugin và một dự án đóng gói riêng biệt. Cốt lõi và các plugin chỉ phụ thuộc vào API. Công cụ xây dựng nào bạn sử dụng để tạo dự án đóng gói tùy thuộc vào bạn. Gradle có lẽ sẽ có hiệu quả hơn trong việc xử lý các bao bì, tuy nhiên có chức năng "kiểm tra" Leiningen cung cấp có thể làm cho sự phát triển của hệ thống như một toàn bộ dễ dàng hơn.

Tôi sẽ xem xét mã cho Leiningen và Noir để tìm hiểu cách xử lý hiệu quả việc này.

Đối với động tải các plugin, tôi sẽ bắt đầu với tìm cách Noir xử lý nó trong hai tập tin của họ:

  • server.clj có namespace tải cho tất cả các file dưới một không gian tên cụ thể. Dưới mui xe, nó sử dụng tools.namespace, nhưng bạn có thể dễ dàng xem cách nó được sử dụng để require mỗi không gian tên theo một cơ sở cụ thể. Đây cũng là cách Leiningen xử lý các nhiệm vụ tùy chỉnh - định nghĩa cơ sở cho nhiệm vụ phải nằm trong leiningen.
  • core.clj có những gì tôi sẽ sử dụng để đăng ký plugin. Tóm lại, sử dụng bản đồ dưới dạng atom và thêm plugin vào bản đồ đó. Tôi sẽ tư vấn gói đăng ký bằng macro để giữ mã của bạn sạch hơn.

Tôi liệt kê ở trên là đủ nếu bạn không cần xử lý thêm plugin vào thời gian chạy. Nếu bạn không có mọi plugin trên classpath trong quá trình khởi động, tôi khuyên bạn nên sử dụng pomegranite để thêm các mục vào classpath. Bạn có thể xem ví dụ trong classpath.clj.

+0

cảm ơn tất cả những điều đó. –

+1

Cập nhật: Có vẻ như Leiningen hiện hỗ trợ phân cấp mô-đun ... theo mô tả plugin [lein-modules] (https://github.com/jcrossley3/lein-modules). – pershyn

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