leiningen - як додати залежності для місцевих банок?


117

Я хочу використовувати leiningen для створення та розвитку свого проекту clojure. Чи є спосіб змінити project.clj, щоб він міг вибрати кілька банок з місцевих каталогів?

У мене є кілька фірмових банок, які не можна завантажувати в публічні репости.

Крім того, чи можна використовувати Leiningen для підтримки каталогу "lib" для проектів clojure? Якщо купа моїх прихильницьких проектів мають одні і ті ж банки, я не хочу зберігати окрему копію для кожного з них.

Дякую


1
Дякую всім. Як було зазначено моїм усім, це тернисте питання, поки немає чіткої відповіді.
шукач сигналів

Відповіді:


38

Ви можете поставити ваші приватні банки, lib/і вони будуть на уроці для цілей lein swankтощо; це, мабуть, перешкоджає використанню інструменту управління залежностями, хоча, якщо ви насправді не хочете, щоб ці залежності управлялися, ви можете ставитися до Лейнінгена як до "інструменту управління залежностями з відкритим кодом", і, можливо, будьте обережні lein clean.

Оскільки ситуація стає більш складною - тут залучається більша кількість приватних банок, вони розвиваються, і вам потрібно взяти до уваги інформацію про їх версію - ідея Артура про створення приватного репо-Maven може бути більш доречною.


(HR означає ознаку відключення конкретної частини Leiningen). Продовжуйте інформацію нижче про загальну історію інструментів управління побудовою / залежністю в землі Clojure, включаючи деякі посилання, які, на мою думку, можуть бути дуже зручними у вашій ситуації.)

Крім того, поки що немає універсальної згоди щодо питання, який найкращий інструмент побудови для Clojure, а Leiningen, набуваючи все більше уваги, також постійно набуває у своїх областях особливості та польський - це означає, зокрема, що це ще не закінчено. Ось цитата Стюарта Халлоуей, автора прагматичної книжкової полиці "Програмування Clojure": "Мій 2с: Лейнінген - важливий крок, але для цього ще багато чого зробити". Для повної публікації та дуже цікавого обговорення питання: побудувати інструменти та подібне у просторі Clojure, див. Leiningen, Clojure та бібліотеки: що мені не вистачає?нитка в групі Clojure Google. Багато учасників конкретно згадують про необхідність наявності локальних залежностей, які не містяться в будь-яких сховищах, локальних чи інших, та детально розробляти рішення, які вони знайшли для таких сценаріїв. Можливо, ви могли побачити, чи є щось там, що може вирішити вашу проблему зараз / може вирішити її в майбутньому, коли набори функцій дозріють?

У будь-якому випадку, можливо, що у Лейнінгена насправді може бути не готова історія для деяких складних сценаріїв. Якщо ви вважаєте, що це може бути правдою для вашого випадку (і я маю на увазі, після розгляду приватної ідеї репо), ось кілька посилань на альтернативи на базі Maven, взяті з вищезгаданої теми : polyglot maven , clojure-maven-plugin ; ця публікація в блозімає на меті бути корисним людям, які намагаються використовувати Maven з Clojure. Як я пам’ятаю, Мейкел Брандмейер (також на SO під його інтернет-ручкою котарака) використовує Gradle (систему побудови Groovy) із плагіном для розміщення Clojure під назвою Clojuresque; Я ніколи не пробував це сам, як не знаю перше, що стосується Groovy, але він стверджує, що з ним виконуються дуже приємні будівельні дії, і я вважаю, що це не має нічого спільного з Maven - щось, що є самим плюсом. для деяких із нас. :-)


2
Re: "Не існує універсальної згоди щодо питання про те, який кращий інструмент побудови для Clojure" ... На сьогоднішній день, здавалося б, Leiningen зараз є еталоном відбігу. Результати опитування 2013 року: lein-survey-2013.herokuapp.com/results
David J.

8
Станом на Leiningen v2 функціональність lib / каталога була видалена. Дивіться: github.com/technomancy/leiningen/wiki/…
Jared314

На сьогоднішній день Лейнінген, мабуть, все ще є найпопулярнішим, але Boot також популярний.
Марс

64

Просто використовуйте : ресурси-шляхи у вашому файлі project.clj. Я використовую його, наприклад для підключення до серверів Siebel. Щойно створив каталог ресурсів у моєму каталозі проектів і скопіював туди файли jar. Але звичайно, ви можете використовувати більш загальний каталог:

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

Тоді з репліка lein я можу створити екземпляри Siebel Data Bean, наприклад

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

Якщо у вас є новіша версія Java, ви, звичайно, можете використовувати підстановку в специфікації вашого шляху, як ця, для більш загального каталогу:

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

Lein 2 не підтримує глобалізацію, але плагін github.com/dchelimsky/lein-expand-resource-paths доступний, якщо вам потрібно.
пондерматичний

2
Це найкраща відповідь, яку я бачив досі. Місцевий mvn install більше не працює для мене.
Девід Вільямс

7
Це не працює з uberjar, оскільки uberjar додасть банки залежностей у банку, замість додавання файлів класу залежностей.
Тобіас Домхан

50
  1. Створіть каталог у проекті:

    mkdir maven_repository

  2. Додайте локальні банки до цього сховища:

    Наприклад, ця команда додає jaad-0.8.3.jarфайл у сховище 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. Додайте до project.clj

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

  4. Тепер черговий lein depsповинен працювати:

    $ 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 з Leiningen (змінено з моменту копіювання)


Приємні кроки за цим посиланням. Це мені дуже допомогло.
goger

2
з новішими версіями, можливо, ви хочете використовувати mvn implementiraj: розгорнути-файл замість install: install-file та вказати -Durl = file: repo замість -DlocalRepositoryPath = repo. Потім у проектах.clj ви можете використовувати:: сховища {"local" "файл: maven_repository"} Див.: Gist.github.com/stuartsierra/3062743 (я редагував питання, але все ще потрібно затвердити)
Тобіас Домхан

33

Я вважаю, що lein pom; lein jar; lein installдобре працює при розробці бібліотек.

Зробіть це в бібліотеці, що розробляється, і ваша програма, яка вимагає, буде використовувати її без :repositoriesнеобхідності foo.


Як варіант, lein do pom, jar, installтрохи більш стислий.


Це дозволяє викликати бібліотеку, як і будь-яку іншу :dependencies [[project-name "version"]]


3
Порівняно з іншими рішеннями, це так просто і працює! Не потрібно встановлювати Maven. Дякую.
dkinzer

Як ви посилаєтесь на отриману банку у файл проекту lein?
interstar

Як і будь-який інший:dependencies [[project-name "version"]]
роболі

1
Це чудово працює і в Windows. Не потрібно встановлювати maven, як уже згадувалося. Я спробував це з IntelliJ + Cursive в Windows, і він працює чудово. У командному рядку Windows зробили "lein pom; lein jar; lein install".
endbegin

4
Вам потрібно лише зробити lein install. Це створить вам банку і пом.
neverfox

15

Я вважаю, що "правильним" підходом є створення приватного сховища Maven, щоб ви могли зберігати банки в одному місці, а всі ваші філії тощо підберуть зміни. Це може бути зайвим для того, що ви робите. Мені цікаво, якщо це простіший спосіб.


5
Дякую, я розберуся. Хоча я маю сказати, що Maven завдає страху в моєму серці. Якщо ви знаєте прості покрокові приклади для цього, будь ласка, вкажіть мені це. Чому побудови настільки чортові складні у світі java?
шукач сигналів



3

Жодне з цих рішень не спрацювало. Натомість я встановив локальне сховище та використав maven для встановлення файлу jar у локальному репо, та додав локальне репо до свого проекту.clj

У командному рядку:

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

І я пишу свій проект.clj так:

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

Сподіваюся, це допомагає.

[ДОВІДКА: https://gist.github.com/stuartsierra/3062743 ]


2

Можливо, подивіться на цю попередню відповідь , я надаю покрокові інструкції щодо налаштування локального сховища до проекту (доступ до file://якого можна отримати ), в якому ви могли б встановити свої банки.



0

Найкращий варіант - налаштувати приватний артефактор JFrog / Nexus і розгорнути там свої знімки / релізи, а потім додати це штучне сховище у вашому project.clj

Інші простіші способи

Статичний HTTP Найпростіший вид приватного сховища - це веб-сервер, вказуваний на каталог, повний статичних файлів. Ви можете використовувати файл: /// URL у ваших: сховищах для розгортання таким чином, якщо каталог локальний для машини, на якій працює Leiningen.

SCP Якщо у вас вже встановлений сервер із вашими відкритими ключами SSH, транспорт scp - це простий спосіб публікувати та споживати приватні залежності. Помістіть такий внутрішній проект:

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

Потім розмістіть наступне поза проектом:

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

Можливо також розгортання у сховище за допомогою scp транспорту та споживання з нього через http, якщо ви встановили nginx або щось подібне для обслуговування каталогу репозиторію через HTTP.

NB Розгортання SCP до Clojars більше не підтримуються

Оригінальне джерело тут https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.