leiningen - bagaimana menambahkan dependensi untuk stoples lokal?

117

Saya ingin menggunakan leiningen untuk membangun dan mengembangkan proyek clojure saya. Apakah ada cara untuk memodifikasi project.clj untuk memintanya mengambil beberapa toples dari direktori lokal?

Saya memiliki beberapa botol berpemilik yang tidak dapat diunggah ke repositori publik.

Selain itu, dapatkah leiningen digunakan untuk memelihara direktori "lib" untuk proyek clojure? Jika sekelompok proyek clojure saya berbagi stoples yang sama, saya tidak ingin menyimpan salinan terpisah untuk masing-masing.

Terima kasih

signalseeker
sumber
1
Terimakasih semuanya. Seperti yang ditunjukkan kepada semua orang, ini adalah masalah pelik yang belum ada jawaban yang jelas.
signalseeker

Jawaban:

38

Anda bisa memasukkan stoples pribadi Anda lib/dan mereka akan berada di jalur kelas untuk tujuan lein swankdan sejenisnya; ini tampaknya mengalahkan tujuan penggunaan alat manajemen ketergantungan, meskipun jika Anda tidak benar - benar ingin ketergantungan tersebut dikelola, Anda dapat memperlakukan Leiningen sebagai "alat manajemen ketergantungan sumber terbuka" dan mungkin berhati-hatilah lein clean.

Ketika situasinya menjadi lebih kompleks - ada lebih banyak botol pribadi yang terlibat, mereka berkembang dan Anda perlu mempertimbangkan beberapa info pembuatan versi pada mereka - ide Arthur untuk membuat repo Maven pribadi mungkin lebih tepat.


(HR menandakan titik cut-off bagian khusus Leiningen ... Lanjutkan di bawah untuk informasi tentang cerita perkakas manajemen build / dependensi umum di negeri Clojure, termasuk beberapa tautan yang menurut saya bisa sangat berguna dalam situasi Anda.)

Selain itu, hingga saat ini, belum ada kesepakatan universal tentang pertanyaan mana yang merupakan alat build terbaik untuk Clojure, dan Leiningen, sembari mendapatkan dalam mindshare, juga terus-menerus mendapatkan fitur dan pemolesan area - artinya, khususnya, bahwa itu belum lengkap. Berikut kutipan dari Stuart Halloway, penulis "Programming Clojure" Pragmatic Bookshelf: "2c saya: Leiningen adalah langkah penting, tetapi masih banyak yang harus dilakukan." Untuk posting lengkap dan diskusi yang sangat menarik tentang: membangun alat dan sejenisnya di ruang Clojure, lihat Leiningen, Clojure dan perpustakaan: apa yang saya lewatkan?utas di grup Google Clojure. Banyak peserta secara khusus menyebutkan perlunya memiliki dependensi lokal yang tidak terdapat dalam repositori apa pun, lokal atau lainnya, dan menguraikan solusi yang mereka buat untuk skenario semacam itu. Mungkin Anda dapat melihat apakah ada sesuatu di sana yang dapat menyelesaikan masalah Anda sekarang / mungkin menyelesaikannya di masa mendatang, ketika fitur sudah matang?

Bagaimanapun, ada kemungkinan bahwa Leiningen sebenarnya belum memiliki cerita yang bagus untuk beberapa skenario yang rumit. Jika Anda merasa ini mungkin benar untuk kasus Anda (dan maksud saya setelah Anda mempertimbangkan ide repo pribadi), berikut adalah beberapa tautan ke alternatif berbasis maven yang diambil dari utas yang disebutkan di atas: polyglot maven , clojure-maven-plugin ; posting blog inibertujuan untuk berguna bagi orang yang mencoba menggunakan maven dengan Clojure. Seingat saya, Meikel Brandmeyer (juga di SO di bawah pegangan online kotarak) menggunakan Gradle (sistem build Groovy) dengan plugin untuk mengakomodasi Clojure yang disebut Clojuresque; Saya tidak pernah mencobanya sendiri, karena tidak tahu apa-apa tentang Groovy, tetapi dia mengklaim menjalankan tindakan bangunan yang sangat bagus dengannya dan saya yakin itu tidak ada hubungannya dengan maven - sesuatu yang merupakan nilai tambah dalam dan dari dirinya sendiri untuk sebagian dari kita. :-)

Michał Marczyk
sumber
2
Re: "tidak ada kesepakatan universal tentang pertanyaan yang merupakan build tool terbaik untuk Clojure" ... Sampai hari ini, tampaknya Leiningen adalah standar pelarian sekarang. Hasil survei 2013: lein-survey-2013.herokuapp.com/results
David J.
8
Sejak Leiningen v2, fungsionalitas direktori lib / telah dihapus. Lihat: github.com/technomancy/leiningen/wiki/…
Jared314
Sampai hari ini, Leiningen mungkin masih yang paling populer, tetapi Boot juga populer.
Mars
64

Cukup gunakan : resource-paths di file project.clj Anda. Saya menggunakannya, misalnya untuk menyambung ke server Siebel. Baru saja membuat direktori sumber daya di direktori proyek saya dan menyalin file jar di sana. Tetapi tentu saja Anda dapat menggunakan direktori yang lebih umum:

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

Kemudian dari lein repl saya dapat membuat instance Siebel Data Bean, misalnya

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

Jika Anda memiliki versi Java yang lebih baru, tentu saja Anda dapat menggunakan karakter pengganti dalam spesifikasi jalur Anda seperti ini untuk direktori yang lebih umum:

:resource-paths ["/tmp/SiebelJars/*"]
Hans-J.
sumber
Lein 2 tidak mendukung globbing, tetapi plugin github.com/dchelimsky/lein-expand-resource-paths tersedia jika Anda perlu.
pondermatic
2
Ini adalah jawaban terbaik yang pernah saya lihat sejauh ini. Penginstalan mvn lokal tampaknya tidak berfungsi lagi untuk saya.
David Williams
7
Ini tidak berfungsi dengan uberjar, karena uberjar akan menambahkan toples dependensi di jar, alih-alih menambahkan file kelas dependensi.
Tobias Domhan
50
  1. Buat direktori dalam proyek:

    mkdir maven_repository

  2. Tambahkan stoples lokal ke repositori ini:

    Misalnya, perintah ini menambahkan jaad-0.8.3.jarfile ke repositori 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. Tambahkan yang berikut ini ke project.clj

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

  4. Sekarang biasa lein depsharus bekerja:

    $ 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

Peringatan tersebut dapat diabaikan, karena jar akan diperiksa ke dalam proyek dan tidak diunduh dari internet.

Sumber asli: Menggunakan JAR lokal dengan Leiningen (diubah sejak penyalinan)

Janus Troelsen
sumber
Langkah bagus di tautan ini. Ini sangat membantu saya.
goger
2
dengan versi yang lebih baru Anda mungkin ingin menggunakan mvn deploy: deploy-file alih-alih install: install-file dan untuk menentukan -Durl = file: repo alih-alih -DlocalRepositoryPath = repo. Di projects.clj Anda kemudian dapat menggunakan:: repositories {"local" "file: maven_repository"} Lihat: gist.github.com/stuartsierra/3062743 (Saya mengedit pertanyaan, tetapi masih perlu disetujui)
Tobias Domhan
33

Saya menemukan lein pom; lein jar; lein installbekerja dengan baik saat mengembangkan perpustakaan.

Lakukan ini di pustaka yang sedang dikembangkan dan aplikasi Anda yang memerlukannya akan menggunakannya tanpa :repositoriesmemerlukan foo apa pun .


Atau, lein do pom, jar, installsedikit lebih ringkas.


Ini memungkinkan pemanggilan perpustakaan seperti yang lain :dependencies [[project-name "version"]]

Greg B
sumber
3
Dibandingkan dengan solusi lain, ini sangat sederhana dan berhasil! Tidak perlu menginstal maven. Terima kasih.
dkinzer
Bagaimana Anda mereferensikan jar yang dihasilkan dalam file proyek lein?
interstar
Seperti yang lain:dependencies [[project-name "version"]]
roboli
1
Ini berfungsi dengan baik di Windows juga. Tidak perlu menginstal maven seperti yang telah disebutkan. Saya telah mencobanya dengan IntelliJ + Cursive di Windows dan berfungsi dengan sempurna. Melakukan "lein pom; lein jar; lein install" pada baris perintah Windows.
Berakhir
4
Anda hanya perlu melakukan lein install. Ini akan membuat toples dan pom untuk Anda.
neverfox
15

Saya yakin pendekatan yang "benar" adalah membuat Repositori Maven pribadi sehingga Anda dapat menyimpan toples di satu lokasi dan semua cabang Anda, dll. Akan menerima perubahannya. Ini mungkin berlebihan untuk apa yang Anda lakukan. Saya ingin tahu apakah ini cara yang lebih mudah.

Arthur Ulfeldt
sumber
5
Terima kasih, saya akan memeriksanya. Meskipun saya harus mengatakan maven menyerang ketakutan di hati saya. Jika Anda mengetahui contoh langkah-demi-langkah sederhana untuk melakukan itu, tolong tunjukkan saya. Mengapa bangunan sangat rumit di dunia java?
signalseeker
3

Tak satu pun dari solusi ini berhasil bagi saya. Sebagai gantinya saya telah menginstal repositori lokal, dan menggunakan maven untuk menginstal file jar di repo lokal, dan menambahkan repo lokal ke project saya.clj

Di baris perintah:

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

Dan saya menulis project.clj saya seperti ini:

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

Semoga membantu.

[REFERENSI: https://gist.github.com/stuartsierra/3062743 ]

Roozbeh Zabihollahi
sumber
2

Mungkin melihat jawaban sebelumnya ini , saya memberikan petunjuk langkah demi langkah untuk menyiapkan repositori lokal ke proyek (diakses melalui file://) di mana Anda dapat menginstal jars Anda.

Pascal Thivent
sumber
0

Pilihan terbaik adalah mengatur artifactory JFrog / Nexus pribadi dan menerapkan snapshot / rilis Anda di sana dan kemudian menambahkan artifiactory itu sebagai repositori di project Anda.clj

Cara lain yang lebih sederhana adalah

HTTP Statis Jenis repositori pribadi yang paling sederhana adalah server web yang diarahkan ke direktori yang penuh dengan file statis. Anda dapat menggunakan file: /// URL di: repositories Anda untuk menerapkan cara tersebut jika direktori tersebut bersifat lokal ke mesin tempat Leiningen dijalankan.

SCP Jika Anda sudah menyiapkan server dengan kunci publik SSH Anda, transpor scp adalah cara sederhana untuk menerbitkan dan menggunakan dependensi privat. Tempatkan defproject dalam berikut ini:

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

Kemudian tempatkan berikut ini di luar 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 []))))

Anda juga dapat menerapkan ke repositori menggunakan transport scp dan menggunakannya melalui http jika Anda menyiapkan nginx atau yang serupa untuk menyajikan direktori repositori melalui HTTP.

Penerapan NB SCP ke Clojars tidak lagi didukung

Sumber aslinya ada di sini https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Robin
sumber