2010-03-08 28 views
100

Tôi muốn sử dụng leiningen để xây dựng và phát triển dự án clojure của mình. Có cách nào để sửa đổi project.clj để nói với nó để chọn một số lọ từ thư mục địa phương?leiningen - làm thế nào để thêm phụ thuộc cho các lọ địa phương?

Tôi có một số lọ độc quyền không thể tải lên repos công khai.

Ngoài ra, leiningen có thể được sử dụng để duy trì thư mục "lib" cho các dự án clojure không? Nếu một loạt các dự án clojure của tôi chia sẻ cùng một lọ, tôi không muốn duy trì một bản sao riêng biệt cho mỗi người trong số họ.

Cảm ơn

+1

Cảm ơn tất cả mọi người. Vì nó đã được chỉ ra tất cả mọi người của tôi, đây là một vấn đề gai góc mà không có câu trả lời rõ ràng có sẵn như được nêu ra. – signalseeker

Trả lời

35

Bạn có thể đặt các lọ riêng tư của mình ở lib/ và chúng sẽ nằm trên đường dẫn lớp cho các mục đích lein swank và các loại tương tự; điều này dường như đánh bại điểm của việc sử dụng công cụ quản lý phụ thuộc, mặc dù nếu bạn không thực sự muốn những người phụ thuộc đó quản lý, bạn có thể coi Leiningen là "công cụ quản lý phụ thuộc nguồn mở" và có thể cẩn thận với lein clean.

Khi tình hình trở nên phức tạp hơn - có một số lượng lớn các jars tư nhân liên quan, chúng phát triển và bạn cần xem xét một số thông tin về phiên bản - ý tưởng tạo ra một repo Maven riêng có thể phù hợp hơn.


(HR nghĩa Leiningen cụ thể điểm phần cắt ... Tiếp tục dưới đây để biết thông tin về những câu chuyện cụ chung xây dựng/quản lý phụ thuộc vào đất Clojure, trong đó có một số liên kết mà tôi nghĩ có thể đến trong rất tiện dụng trong trường hợp của bạn.)

Ngoài ra, chưa có thỏa thuận chung về câu hỏi nào là công cụ xây dựng tốt nhất cho Clojure và Leiningen, trong khi tăng tốc, cũng liên tục đạt được trong các lĩnh vực các tính năng và đánh bóng - có nghĩa là, đặc biệt là nó chưa hoàn chỉnh. Dưới đây là một trích dẫn từ Stuart Halloway, tác giả cuốn sách "Lập trình Clojure" của Pragmatic Bookshelf: "My 2c: Leiningen là một bước quan trọng, nhưng vẫn còn nhiều việc phải làm." Đối với toàn bộ bài đăng và một cuộc thảo luận rất thú vị: xây dựng các công cụ và những thứ tương tự trong không gian Clojure, hãy xem chuỗi Leiningen, Clojure and libraries: what am I missing? trên nhóm Google Clojure. Nhiều người tham gia đặc biệt đề cập đến sự cần thiết phải có phụ thuộc địa phương không chứa trong bất kỳ kho, địa phương hoặc cách khác, và xây dựng trên các giải pháp mà họ đã đưa ra cho các kịch bản như vậy. Có lẽ bạn có thể thấy nếu có bất cứ điều gì ở đó có thể giải quyết vấn đề của bạn ngay bây giờ/có thể giải quyết nó trong tương lai, khi tính năng đặt trưởng thành?

Dù sao, có thể Leiningen có thể chưa thực sự có sẵn một câu chuyện hay cho một số tình huống phức tạp. Nếu bạn cảm thấy điều này có thể đúng với trường hợp của bạn (và ý tôi là sau khi bạn xem xét ý tưởng repo riêng), đây là một số liên kết đến các lựa chọn thay thế dựa trên maven được lấy từ chuỗi đã đề cập ở trên: polyglot maven, clojure-maven-plugin; this blog posting nhằm mục đích hữu ích cho những người đang cố gắng sử dụng maven với Clojure. Như tôi nhớ lại, Meikel Brandmeyer (cũng trên SO dưới sự quản lý trực tuyến của ông về kotarak) sử dụng Gradle (một hệ thống xây dựng Groovy) với một plugin để chứa Clojure được gọi là Clojuresque; Tôi không bao giờ tự thử nó, vì không biết điều đầu tiên về Groovy, nhưng anh ta tuyên bố sẽ thực hiện một hành động xây dựng rất tốt đẹp với nó và tôi tin rằng nó chẳng liên quan gì đến maven - cái gì đó là một điểm cộng và của chính nó đối với một số người trong chúng ta.:-)

+2

Re: "không có thỏa thuận chung về câu hỏi đó là công cụ xây dựng tốt nhất cho Clojure" ... Tính đến hôm nay, có vẻ như Leiningen là tiêu chuẩn chạy trốn ngay bây giờ. Kết quả khảo sát 2013: https://lein-survey-2013.herokuapp.com/results –

+7

Kể từ Leiningen v2, chức năng thư mục/lib đã bị xóa. Xem: https://github.com/technomancy/leiningen/wiki/Repeatability#free-floating-jars – Jared314

+0

Tính đến hôm nay, Leiningen có lẽ vẫn là phổ biến nhất, nhưng Boot cũng rất phổ biến. – Mars

13

tôi tin rằng phương pháp "đúng" là create a private Maven Repository để bạn có thể lưu trữ các lọ trong một địa điểm duy nhất và tất cả các chi nhánh của bạn vv sẽ nhận các thay đổi. Điều này có thể là quá mức cần thiết cho những gì bạn đang làm. Tôi tò mò nếu đây là một cách dễ dàng hơn.

+5

Cảm ơn, tôi sẽ xem xét nó. Mặc dù tôi phải nói rằng maven tấn công trong lòng tôi. Nếu bạn biết bất kỳ ví dụ từng bước đơn giản nào để làm điều đó, vui lòng chỉ cho tôi. Tại sao các bản dựng lại quá phức tạp trong thế giới java? – signalseeker

+4

Xin lỗi, sự thông cảm sẽ giúp ích cho bạn? –

2

Có thể xem previous answer, tôi cung cấp hướng dẫn từng bước để thiết lập kho lưu trữ cục bộ cho dự án (truy cập qua file://), trong đó bạn có thể cài đặt các lọ của mình.

42
  1. Tạo một thư mục trong dự án:

    mkdir maven_repository

  2. Thêm lọ địa phương để kho này:

    Ví dụ, lệnh này cho biết thêm các tập tin jaad-0.8.3.jar vào kho maven :

    mvn deploy:deploy-file -Dfile=jaad-0.8.3.jar -DartifactId=jaad -Dversion=0.8.3 -DgroupId=jaad -Dpackaging=jar -Durl=file:maven_repository

  3. Thêm dòng sau vào project.clj

    :repositories {"local" "file:maven_repository"}

  4. Bây giờ thường xuyên lein deps nên làm việc:

    $ lein deps Downloading: jaad/jaad/0.8.3/jaad-0.8.3.pom from local Transferring 0K from local [WARNING] *** CHECKSUM FAILED - Error retrieving checksum file for jaad/jaad/0.8.3/jaad-0.8.3.pom - IGNORING

Cảnh báo có thể được bỏ qua, kể từ khi bình sẽ đã đăng ký vào dự án và không được tải xuống từ internet.

nguồn gốc: Using local JAR's with Leiningen (thay đổi kể từ sao chép)

+0

Các bước đẹp tại liên kết này. Điều này rất hữu ích với tôi. – goger

+1

Tùy chọn bổ sung @ https://gist.github.com/3062743 – bostonou

+2

với các phiên bản mới hơn bạn có thể muốn sử dụng mvn deploy: deploy-file thay vì cài đặt: install-file và để chỉ định -Durl = file: repo thay vì -DlocalRepositoryPath = repo. Trong projects.clj, bạn có thể sử dụng:: repositories {"local" "file: maven_repository"} Xem: https://gist.github.com/stuartsierra/3062743 (Tôi đã chỉnh sửa câu hỏi, nhưng vẫn cần phải được phê duyệt) –

25

tôi thấy lein pom; lein jar; lein install hoạt động tốt khi phát triển thư viện.

Làm điều này trong thư viện đang được phát triển và ứng dụng của bạn yêu cầu nó sẽ sử dụng nó mà không cần bất kỳ yêu cầu nào :repositories foo.


Cách khác, lein do pom, jar, install hơi ngắn gọn hơn.


này cho phép gọi thư viện giống như bất kỳ khác :dependencies [[project-name "version"]]

+2

So với các giải pháp khác, điều này rất đơn giản và nó hoạt động! Không cần cài đặt maven. Cảm ơn. – dkinzer

+0

Làm thế nào để bạn tham chiếu đến jar kết quả trong một tệp dự án lein? – interstar

+0

Giống như bất kỳ ': phụ thuộc khác [[project-name" version "]]' – roboli

50

Chỉ cần sử dụng : tài nguyên đường dẫn trong tập tin project.clj của bạn. Tôi sử dụng nó, ví dụ: để kết nối với máy chủ Siebel. Chỉ cần tạo một tài nguyên trong thư mục dự án của tôi và sao chép các tệp jar trong đó.Nhưng tất nhiên bạn có thể sử dụng một thư mục chung chung hơn:

(defproject test-project "0.1.0-SNAPSHOT" 
:description "Blah blah blah" 
... 
:resource-paths ["resources/Siebel.jar" "resources/SiebelJI_enu.jar"]) 

Sau đó từ Lein repl tôi có thể tạo ra các trường hợp Siebel liệu Bean, ví dụ

(def sbl (com.siebel.data.SiebelDataBean.)) 
(.login sbl "siebelServer" "user" "password") 
... 

Nếu bạn có một phiên bản mới hơn Java bạn có thể các ký tự đại diện sử dụng nhiên trong đặc tả đường dẫn của bạn như thế này cho một thư mục tổng quát hơn:

:resource-paths ["/tmp/SiebelJars/*"] 
+0

Lein 2 không hỗ trợ globbing, nhưng https://github.com/dchelimsky/lein-expand-resource-paths plugin có sẵn nếu bạn cần. – pondermatic

+2

Tôi gặp lỗi không tìm thấy lớp học. – divs1210

+1

Đây là câu trả lời hay nhất mà tôi đã thấy cho đến nay. Các cài đặt mvn địa phương không xuất hiện để làm việc cho tôi nữa. –

2

Không có giải pháp nào trong số này có hiệu quả với tôi. Thay vào đó tôi đã cài đặt một kho lưu trữ địa phương, và sử dụng maven để cài đặt các tập tin jar trong repo địa phương, và thêm repo địa phương để project.clj tôi

Trong dòng lệnh:

mvn deploy:deploy-file -DgroupId=local -DartifactId=bar \ 
    -Dversion=1.0.0 -Dpackaging=jar -Dfile=bar.jar \ 
    -Durl=file:repo 

Và tôi viết tôi project.clj như thế này:

(defproject foo "0.1.0-SNAPSHOT" 
    :dependencies [[org.clojure/clojure "1.4.0"] 
       [local/bar "1.0.0"]] 
    :repositories {"project" "file:repo"}) 

Hy vọng điều đó sẽ hữu ích.

[THAM KHẢO: https://gist.github.com/stuartsierra/3062743]

0

Lựa chọn tốt nhất là để thiết lập một JFrog/Nexus artifactory tin và triển khai các snapshots/phát hành ở đó và sau đó thêm artifiactory rằng như kho trong bạn project.clj

cách đơn giản khác là

HTTP tĩnh Loại lưu trữ riêng tư đơn giản nhất là máy chủ web trỏ vào thư mục chứa đầy đủ tệp tĩnh. Bạn có thể sử dụng một tệp: /// URL trong: kho lưu trữ của bạn để triển khai theo cách đó nếu thư mục là cục bộ cho máy mà Leiningen đang chạy.

SCP Nếu bạn đã có một máy chủ được thiết lập với khóa công cộng SSH, việc vận chuyển scp là cách đơn giản để xuất bản và sử dụng phụ thuộc riêng tư. Đặt defproject bên sau:

:plugins [[org.apache.maven.wagon/wagon-ssh-external "2.6"]] 
:repositories [["releases" "scp://somerepo.com/home/repo/"]] 

Sau đó, đặt sau ngoài defproject:

(cemerick.pomegranate.aether/register-wagon-factory! 
"scp" #(let [c (resolve 'org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon)] 
      (clojure.lang.Reflector/invokeConstructor c (into-array [])))) 

Cũng có thể để triển khai đến một kho lưu trữ bằng cách sử dụng phương tiện giao thông scp và tiêu thụ từ nó qua http nếu bạn thiết lập nginx hoặc một cái gì đó tương tự để phục vụ thư mục kho lưu trữ trên HTTP.

N.B. SCP triển khai để Clojars không còn được hỗ trợ

nguồn gốc là ở đây https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

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