leiningen - yerel kavanozlar için bağımlılıklar nasıl eklenir?


117

Clojure projemi oluşturmak ve geliştirmek için leiningen'i kullanmak istiyorum. Project.clj dosyasını yerel dizinlerden bazı kavanozlar seçmesini söylemenin bir yolu var mı?

Genel depolara yüklenemeyen bazı özel kavanozlarım var.

Ayrıca, leiningen clojure projeleri için bir "lib" dizini tutmak için kullanılabilir mi? Clojure projelerimden birkaçı aynı kavanozları paylaşıyorsa, her biri için ayrı bir kopya tutmak istemiyorum.

Teşekkürler


1
Herkese teşekkürler. Herkesin işaret ettiği gibi, bu henüz net bir cevabı olmayan çetrefilli bir konu.
signalseeker

Yanıtlar:


38

Özel kavanozlarınızı koyabilirsiniz lib/ ve bunlar vb. Amaçlar için sınıf yolunda olacaktır lein swank; Bu, bir bağımlılık yönetimi aracı kullanma noktasını ortadan kaldırıyor gibi görünüyor, ancak bu bağımlılıkların gerçekten yönetilmesini istemiyorsanız , Leiningen'i bir "açık kaynak bağımlılıkları yönetim aracı" olarak ele alabilir ve belki de dikkatli olabilirsiniz lein clean.

Durum daha karmaşık hale geldikçe - daha fazla sayıda özel kavanoz var, bunlar gelişiyor ve bunlarla ilgili bazı sürüm bilgilerini hesaba katmanız gerekiyor - Arthur'un özel bir Maven deposu oluşturma fikri daha uygun olabilir.


(İK, Leiningen'e özgü parça kesme noktasını belirtir ... Aşağıda, sizin durumunuzda çok kullanışlı olabileceğini düşündüğüm bazı bağlantılar da dahil olmak üzere, Clojure arazisindeki genel yapı / bağımlılık yönetimi araçları hikayesi hakkında bilgi için devam edin.)

Ayrıca, şu an için, Clojure için en iyi inşa aracının hangisi olduğu konusunda evrensel bir anlaşma yoktur ve Leiningen, akıl paylaşımında kazanırken, aynı zamanda sürekli olarak özellikler ve cilalama alanlarında da kazanmaktadır - yani, özellikle henüz tamamlanmadı. Pragmatic Bookshelf'in "Programming Clojure" kitabının yazarı Stuart Halloway'den bir alıntı: "My 2c: Leiningen önemli bir adım, ancak hala yapılacak çok şey var." Tam yayınlama ve çok ilginç bir tartışma için yeniden: Clojure uzayında araçlar ve benzerlerini oluşturun, Leiningen, Clojure ve kütüphanelere bakın: Neyi kaçırıyorum?Clojure Google grubunda ileti dizisi. Pek çok katılımcı, yerel ya da başka herhangi bir depoda bulunmayan yerel bağımlılıklara sahip olma ihtiyacından özellikle bahsetmekte ve bu tür senaryolar için buldukları çözümleri detaylandırmaktadır. Belki de orada sorununuzu şimdi çözebilecek / gelecekte çözebilecek bir şey olup olmadığını, özellik kümeleri olgunlaştığında görebilirsiniz.

Her neyse, Leiningen'in aslında bazı karmaşık senaryolar için iyi bir hikayesi olmayabilir. Bunun sizin durumunuz için doğru olabileceğini düşünüyorsanız (ve özel repo fikrini düşündükten sonra), işte yukarıda bahsedilen başlıktan alınan maven tabanlı alternatiflere bazı bağlantılar: polyglot maven , clojure-maven-plugin ; bu blog gönderimiClojure ile maven kullanmaya çalışan kişilere faydalı olmayı amaçlamaktadır. Hatırladığım kadarıyla, Meikel Brandmeyer (aynı zamanda SO'da kotarak'ın çevrim içi tanıtıcısı altında) Clojuresque adlı Clojure'u barındırmak için bir eklenti ile Gradle (bir Groovy inşa sistemi) kullanıyor; Groovy ile ilgili ilk şeyi bilmediğimden, bunu kendim hiç denemedim, ama onunla çok güzel bir yapı sergilediğini iddia ediyor ve bunun maven ile hiçbir ilgisi olmadığına inanıyorum - kendi başına bir artı olan bir şey bazılarımız için. :-)


2
Re: "Clojure için en iyi inşa aracının hangisi olduğu konusunda evrensel bir anlaşma yok" ... Bugün itibariyle Leiningen artık kaçış standardı gibi görünüyor. 2013 anket sonuçları: lein-survey-2013.herokuapp.com/results
David J.

8
Leiningen v2'den itibaren, lib / dizin işlevi kaldırılmıştır. Bakınız: github.com/technomancy/leiningen/wiki/…
Jared314

Bugün itibariyle Leiningen muhtemelen en popüler olanıdır, ancak Boot da popülerdir.
Mars

64

Sadece project.clj dosyanızdaki kaynak-yollarını kullanın . Örneğin Siebel sunucularına bağlanmak için kullanıyorum. Proje dizinimde bir kaynaklar dizini oluşturdum ve içindeki jar dosyalarını kopyaladım. Ancak elbette daha genel bir dizin de kullanabilirsiniz:

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

Daha sonra temel repl'den Siebel Data Bean örnekleri oluşturabilirim, ör.

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

Daha yeni bir Java sürümünüz varsa, daha genel bir dizin için yol belirtiminizde elbette joker karakterler kullanabilirsiniz:

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

Lein 2, globbing'i desteklemez, ancak gerekirse github.com/dchelimsky/lein-expand-resource-paths eklentisi mevcuttur.
pondermatic

2
Bu şimdiye kadar gördüğüm en iyi cevap. Yerel mvn kurulumu artık benim için çalışmıyor gibi görünüyor.
David Williams

7
Bu, uberjar ile çalışmaz, çünkü uberjar, bağımlılıklar sınıf dosyalarını eklemek yerine kavanozun içine bağımlılık kavanozlarını ekleyecektir.
Tobias Domhan

50
  1. Projede bir dizin oluşturun:

    mkdir maven_repository

  2. Bu depoya yerel kavanozlar ekleyin:

    Örneğin, bu komut, jaad-0.8.3.jardosyayı maven havuzuna ekler :

    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. Aşağıdakileri şuraya ekleyin: project.clj

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

  4. Şimdi bir düzenli lein depsçalışmalıdır:

    $ 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

Jar projeye kaydedileceği ve internetten indirilmeyeceği için uyarı göz ardı edilebilir.

Orijinal kaynak: Leiningen ile yerel JAR'ları kullanma (kopyalamadan sonra değiştirildi)


Bu bağlantıda güzel adımlar. Bu bana çok yardımcı oldu.
goger

2
daha yeni sürümlerde mvn deploy: deploy-file yerine install: install-file kullanmak ve -DlocalRepositoryPath = repo yerine -Durl = file: repo belirtmek isteyebilirsiniz. Projects.clj'de daha sonra şunları kullanabilirsiniz:: repositories {"local" "file: maven_repository"} Bkz: gist.github.com/stuartsierra/3062743 ( Soruyu düzenledim, ancak yine de onaylanması gerekiyor)
Tobias Domhan

33

lein pom; lein jar; lein installKitaplıkları geliştirirken iyi iş buluyorum .

Bunu geliştirilmekte olan kütüphanede yapın ve bunu gerektiren uygulamanız herhangi bir :repositoriesfoo gerekmeden kullanacaktır .


Alternatif olarak, lein do pom, jar, installbiraz daha özlüdür.


Bu, kütüphaneyi diğer herhangi bir :dependencies [[project-name "version"]]


3
Diğer çözümlerle karşılaştırıldığında bu çok basit ve işe yarıyor! Maven kurmaya gerek yok. Teşekkürler.
dkinzer

Bir lein proje dosyasında ortaya çıkan jar'e nasıl başvurursunuz?
interstar

Diğerleri gibi:dependencies [[project-name "version"]]
roboli

1
Bu, Windows'ta da harika çalışıyor. Daha önce de belirtildiği gibi maven'i kurmanıza gerek yok. Windows üzerinde IntelliJ + Cursive ile denedim ve mükemmel çalışıyor. Windows komut satırında "lein pom; lein jar; lein install" yapıldı.
2016

4
Yapmanız gereken tek şey lein install. Kavanozu ve pomu senin için yapacak.
neverfox

15

"Doğru" yaklaşımın, kavanozları tek bir yerde saklayabilmeniz ve tüm şubeleriniz vb. Değişiklikleri alması için özel bir Maven Deposu oluşturmak olduğuna inanıyorum . Bu, yaptığınız şey için aşırı olabilir. Bunun daha kolay bir yol olup olmadığını merak ediyorum.


5
Teşekkürler, araştıracağım. Maven'in kalbime korku soktuğunu söylemem gerekse de. Bunu yapmak için herhangi bir basit adım adım örnek biliyorsanız, lütfen beni işaret edin. Java dünyasında yapılar neden bu kadar karmaşık?
signalseeker



3

Bu çözümlerin hiçbiri bana işe yaramadı. Bunun yerine yerel bir depo kurdum ve jar dosyasını yerel depoya yüklemek için maven kullandım ve yerel depoyu project.clj dosyama ekledim.

Komut satırında:

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

Ve project.clj dosyamı şöyle yazıyorum:

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

Umarım yardımcı olur.

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


2

Belki bu önceki cevaba bir göz file://atabilirim, kavanozlarınızı kurabileceğiniz projeye yerel (üzerinden erişilen ) bir depo kurmak için adım adım talimatlar veriyorum .



0

En iyi seçenek, özel bir JFrog / Nexus yapay oluşturmak ve anlık görüntülerinizi / sürümlerinizi oraya dağıtmak ve ardından bu yapıyı, project.clj içinde depolar olarak eklemektir.

Diğer basit yollar

Statik HTTP En basit özel depo türü, statik dosyalarla dolu bir dizini işaret eden bir web sunucusudur. Dizin, Leiningen'in çalıştığı makineye yerelse, bu şekilde dağıtmak için: depolarınızda bir file: /// URL kullanabilirsiniz.

SCP SSH genel anahtarlarınızla kurulmuş bir sunucunuz varsa, scp aktarımı özel bağımlılıkları yayınlamanın ve kullanmanın basit bir yoludur. Aşağıdakileri defprojenin içine yerleştirin:

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

Ardından, aşağıdakileri defprojenin dışına yerleştirin:

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

Ayrıca nginx veya depo dizinine HTTP üzerinden hizmet vermek için benzer bir şey ayarlarsanız, scp aktarımını kullanarak bir depoya dağıtmak ve ondan http üzerinden kullanmak da mümkündür.

NB SCP'nin Clojars'a dağıtımları artık desteklenmiyor

Orijinal kaynak burada https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.