leiningen - как добавить зависимости для локальных фляг? - PullRequest
110 голосов
/ 08 марта 2010

Я хочу использовать leiningen для создания и развития моего проекта clojure. Есть ли способ изменить project.clj, чтобы он указывал на выбор файлов jar из локальных каталогов?

У меня есть несколько фирменных jar-файлов, которые нельзя загрузить в общедоступные репозитории.

Кроме того, можно ли использовать leiningen для поддержки каталога "lib" для проектов clojure? Если в нескольких моих проектах clojure используются одни и те же банки, я не хочу хранить отдельную копию для каждого из них.

Спасибо

Ответы [ 11 ]

61 голосов
/ 28 декабря 2012

Просто используйте : paths-paths в вашем файле project.clj. Я использую это, например подключиться к серверам Siebel. Просто создал каталог resources в каталоге моего проекта и скопировал туда файлы jar. Но, конечно, вы можете использовать более общий каталог:

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

Затем из lein repl я могу создать экземпляры Siebel Data Bean, например,

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

Если у вас более новая версия Java, вы, конечно, можете использовать подстановочные знаки в спецификации пути, например, для более общего каталога:

:resource-paths ["/tmp/SiebelJars/*"]
47 голосов
/ 29 марта 2012
  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 (изменено с момента копирования)

36 голосов
/ 09 марта 2010

Вы можете поместить свои личные банки в lib/, и они будут на пути к классам для целей lein swank и т.п .; похоже, это лишает смысла использование инструмента управления зависимостями, хотя, если вы на самом деле не хотите управлять этими зависимостями, вы можете рассматривать Leiningen как «инструмент управления зависимостями с открытым исходным кодом» и, возможно, быть осторожным с lein clean.

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


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

Кроме того, до сих пор нет универсального соглашения по вопросу о том, какой инструмент лучше всего подходит для Clojure, и Лайнинген, приобретая общий разум, также постоянно приобретает все большее значение в областях, в которых имеются особенности и полировка, то есть в частности, что это еще не завершено. Вот цитата из Стюарта Хэллоуэя, автора книги «Прагматичная книжная полка» «Clojure для программирования»: «Мой 2c: Leiningen - важный шаг, но многое еще предстоит сделать». Полный текст публикации и очень интересное обсуждение: инструменты для сборки и тому подобное в пространстве Clojure см. В статье Leiningen, Clojure и библиотеках: что мне не хватает? ветка в группе Google Clojure. Многие участники особо отмечают необходимость наличия локальных зависимостей, не содержащихся ни в каких репозиториях, локальных или иных, и подробно описывают решения, которые они придумали для таких сценариев. Возможно, вы могли бы увидеть, есть ли что-нибудь, что может решить вашу проблему сейчас / может решить ее в будущем, когда наборы функций созреют?

В любом случае, возможно, у Лейнингена, возможно, еще нет хорошей истории, готовой к некоторым сложным сценариям. Если вы считаете, что это может относиться к вашему случаю (и я имею в виду, что после того, как вы рассмотрите идею частного репо), вот несколько ссылок на альтернативы на основе maven, взятые из вышеупомянутой темы: polyglot maven , Clojure-Maven-плагин ; эта запись в блоге стремится быть полезной для людей, пытающихся использовать maven с Clojure. Насколько я помню, Мейкель Брандмейер (также в SO под его онлайн-дескриптором kotarak) использует Gradle (систему сборки Groovy) с плагином для размещения Clojure под названием Clojuresque; Я никогда не пробовал сам, так как не знаю ничего о Groovy, но он утверждает, что провел с ним очень хороший строительный акт, и я считаю, что он не имеет ничего общего с maven - что является плюсом само по себе для некоторых из нас. : -)

28 голосов
/ 06 декабря 2012

Я считаю, lein pom; lein jar; lein install хорошо работает при разработке библиотек.

Сделайте это в разрабатываемой библиотеке, и ваше приложение, в котором оно требуется, будет использовать ее без :repositories foo required. <Ч />

В качестве альтернативы, lein do pom, jar, install немного более лаконичен.

<Ч />

Это позволяет вызывать библиотеку как любой другой :dependencies [[project-name "version"]]

14 голосов
/ 09 марта 2010

Я считаю, что "правильный" подход заключается в создании частного репозитория Maven , чтобы вы могли хранить банки в одном месте, и все ваши ветви и т. Д. Примут изменения.Это может быть излишним за то, что вы делаете.Мне любопытно, если это более простой способ.

9 голосов
/ 06 мая 2012

Вы можете использовать плагин lein-localrepo: https://github.com/kumarshantanu/lein-localrepo

4 голосов
/ 29 января 2012

Недавняя разработка - плагин Фила s3-wagon-private для Leiningen: https://github.com/technomancy/s3-wagon-private

Это должно позволить вам публиковать артефакты в частном удаленном репо.

2 голосов
/ 21 ноября 2014

Ни одно из этих решений не помогло мне. Вместо этого я установил локальный репозиторий и использовал maven для установки файла jar в локальный репозиторий и добавил локальный репозиторий в свой проект.

В командной строке:

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

И я пишу свой project.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 голосов
/ 09 марта 2010

Может быть, посмотрите на этот предыдущий ответ , я предоставляю пошаговые инструкции по настройке хранилища, локального для проекта (доступ к которому осуществляется через file://), в котором вы можете установить свои jar-файлы.

0 голосов
/ 12 февраля 2018

Лучший вариант - настроить частный артефакт JFrog / Nexus и развернуть там свои снимки / выпуски, а затем добавить этот артефакт в качестве репозитория в вашем проекте.1005 * Статический HTTP Самый простой вид частного хранилища - это веб-сервер, указывающий на каталог, полный статических файлов.Вы можете использовать URL-адрес file: /// в своих репозиториях: для такого развертывания, если каталог является локальным для компьютера, на котором работает Leiningen.

SCP Если у вас уже естьСервер, настроенный с вашими открытыми ключами SSH, транспорт scp - это простой способ публикации и использования личных зависимостей.Поместите следующее в defproject:

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

Затем поместите следующее вне 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 []))))

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

NB развертывание SCP в Clojars больше не поддерживается

Исходный источник здесь https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

...