leiningen - làm thế nào để thêm các phụ thuộc cho các lọ cục bộ?


117

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 để bảo nó chọn một số lọ từ các thư mục cục bộ không?

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

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

Cảm ơn


1
Cảm ơn mọi người. Như nó đã được chỉ ra với mọi người của tôi, đây là một vấn đề hóc búa mà vẫn chưa có câu trả lời rõ ràng.
signalseeker

Câu trả lời:


38

Bạn có thể đặt các lọ riêng của mình vào lib/và chúng sẽ ở trên classpath cho các mục đích lein swankvà tương tự; điều này dường như đánh bại quan điểm của việc sử dụng một 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 phụ thuộc đó được quản lý, bạn có thể coi Leiningen như một "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 hơn các lọ riêng có liên quan, chúng sẽ phát triển và bạn cần tính đến một số thông tin về phiên bản cho chúng - ý tưởng của Arthur về việc tạo một repo Maven riêng có thể phù hợp hơn.


(Nhân sự biểu thị điểm cắt phần cụ thể của Leiningen ... Tiếp tục bên dưới để biết thông tin về câu chuyện chung của công cụ quản lý phụ thuộc / xây dựng ở Clojure land, bao gồm một số liên kết mà tôi nghĩ có thể rất hữu ích trong tình huống của bạn.)

Ngoài ra, vẫn chưa có sự thống nhất chung nào về câu hỏi đâu là công cụ xây dựng tốt nhất cho Clojure và Leiningen, trong khi tăng cường chia sẻ tư duy, cũng liên tục đạt được trong các lĩnh vực tính năng và đánh bóng - nghĩa là, đặc biệt, nó vẫn chưa hoàn thành. Đây là câu nói của Stuart Halloway, tác giả của 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." Để có bài đăng đầy đủ và một cuộc thảo luận rất thú vị 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 Leiningen, Clojure và các thư viện: tôi còn thiếu gì?chủ đề trên nhóm Google Clojure. Nhiều người tham gia đề cập cụ thể sự cần thiết phải có các phụ thuộc cục bộ không có trong bất kỳ kho lưu trữ nào, cục bộ hay cách khác, và giải thích rõ hơn về các giải pháp mà họ đã đưa ra cho các tình huống như vậy. Có lẽ bạn có thể xem liệu có điều gì ở đó có thể giải quyết vấn đề của bạn bây giờ / có thể giải quyết nó trong tương lai, khi các bộ tính năng hoàn thiện không?

Dù sao, có thể là Leiningen trên thực tế có thể chưa có một cốt truyện hay cho một số kịch bản 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 mình (và ý tôi là sau khi bạn xem xét ý tưởng repo riêng tư), đâ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ừ chủ đề đã đề cập ở trên: polyglot maven , clojure-maven-plugin ; bài blog nàynhằ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 tay quản lý kotarak trực tuyến của anh ấy) sử dụng Gradle (một hệ thống xây dựng Groovy) với một plugin để chứa Clojure có tên là Clojuresque; Tôi chưa bao giờ tự mình thử nó, vì không biết điều đầu tiên về Groovy, nhưng anh ấy tuyên bố sẽ thực hiện một hành động xây dựng rất tốt với nó và tôi tin rằng nó không liên quan gì đến maven - một cái gì đó là một điểm cộng của chính nó cho một số người trong chúng ta. :-)


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

8
Kể từ Leiningen v2, chức năng thư mục / lib đã bị loại bỏ. Xem: github.com/technomancy/leiningen/wiki/…
Jared314

Cho đến ngày nay, Leiningen có lẽ vẫn là phổ biến nhất, nhưng Boot cũng phổ biến.
Mars vào

64

Chỉ cần sử dụng : resource-path trong tệp 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 thư mục tài nguyên trong thư mục dự án của tôi và sao chép các tệp jar vào đó. 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ừ repl lein, tôi có thể tạo các phiên bản Siebel Data Bean, ví dụ:

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

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

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

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

2
Đây là câu trả lời tốt nhất mà tôi đã thấy cho đến nay. Cài đặt mvn cục bộ dường như không hoạt động với tôi nữa.
David Williams

7
Điều này không hoạt động với uberjar, vì uberjar sẽ thêm các lọ phụ thuộc vào trong jar, thay vì thêm các tệp lớp phụ thuộc.
Tobias Domhan

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

    mkdir maven_repository

  2. Thêm các lọ cục bộ vào kho lưu trữ này:

    Ví dụ: lệnh này thêm jaad-0.8.3.jartệp vào kho lưu trữ 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 phần sau vào project.clj

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

  4. Bây giờ một quy tắc lein depsnên hoạt động:

    $ 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, vì jar sẽ được kiểm tra trong dự án và không được tải xuống từ internet.

Nguồn gốc: Sử dụng JAR cục bộ với Leiningen (đã thay đổi từ khi sao chép)


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

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ì install: install-file và để chỉ định -Durl = file: repo thay vì -DlocalRepositoryPath = repo. Sau đó, bạn có thể sử dụng: trong websites.clj: repositories {"local" "file: maven_repository"} Xem: gist.github.com/stuartsierra/3062743 (Tôi đã chỉnh sửa câu hỏi, nhưng vẫn cần được phê duyệt)
Tobias Domhan

33

Tôi thấy lein pom; lein jar; lein installhoạ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ỳ :repositoriesfoo nào .


Ngoài ra, lein do pom, jar, installngắn gọn hơn một chút.


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


3
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

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

Giống như bất kỳ khác:dependencies [[project-name "version"]]
roboli

1
Điều này cũng hoạt động tốt trên Windows. Không cần cài đặt maven như đã được đề cập. Tôi đã thử nó với IntelliJ + Cursive trên Windows và nó hoạt động hoàn hảo. Đã thực hiện "lein pom; lein jar; lein install" trên dòng lệnh Windows.
endbegin

4
Bạn chỉ cần làm lein install. Nó sẽ xây dựng bình và pom cho bạn.
neverfox

15

Tôi tin rằng cách tiếp cận "đúng" là tạo một Kho lưu trữ Maven riêng để bạn có thể lưu trữ các lọ ở một vị trí duy nhất và tất cả các chi nhánh của bạn, v.v. 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 đánh vào lòng tôi nỗi sợ hã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 phức tạp đến vậy trong thế giới java?
signalseeker



3

Không có giải pháp nào trong số này hiệu quả với tôi. Thay vào đó, tôi đã cài đặt kho lưu trữ cục bộ và sử dụng maven để cài đặt tệp jar trong kho lưu trữ cục bộ và thêm kho lưu trữ cục bộ vào project.clj của 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 project.clj của mình 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 nó giúp.

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


2

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



0

Tùy chọn tốt nhất là thiết lập một kỹ thuật viên JFrog / Nexus riêng tư và triển khai ảnh chụp nhanh / bản phát hành của bạn ở đó và sau đó thêm bộ tạo tác đó làm kho lưu trữ trong dự án của bạn.clj

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

HTTP tĩnh Loại kho lưu trữ riêng tư đơn giản nhất là một máy chủ web trỏ đến một thư mục chứa đầy các tệp tĩnh. Bạn có thể sử dụng tệp: /// URL trong kho: 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 khai SSH của mình, việc vận chuyển scp là một cách đơn giản để xuất bản và sử dụng các phụ thuộc riêng tư. Đặt phần sau bên trong defproject:

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

Sau đó đặt phần sau bên ngoài dự án:

(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 tới một kho lưu trữ bằng cách sử dụng vận chuyển scp và sử dụng từ đó qua http nếu bạn thiết lập nginx hoặc thứ gì đó tương tự để phân phát thư mục kho lưu trữ qua HTTP.

NB SCP triển khai cho Clojars không còn được hỗ trợ

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.