2017-01-12 3 views
4

Я разрабатываю библиотеку и приложение, которое использует эту библиотеку.Как использовать локальные зависимости в Clojure?

У меня нет удаленного хранилища для этой библиотеки, оно хранится только в GitHub как обычный проект.

В моем приложении я хочу использовать эту библиотеку в качестве зависимости, о чем я думаю о том, чтобы иметь структуру, как, что:

. 
├── README.md 
├── project.clj 
├── repo 
├── src 
├── target 
├── libraries 
│ └── my-library 
└── test 

my-library, в котором находится git submodule с моей библиотекой. Как сообщить моей заявке об этой зависимости?

Что такое решение 2016 года для этого?

+0

Это похоже на дубликат http://stackoverflow.com/q/2404426. Просьба уточнить, нет ли этого. – glts

+0

Возможный дубликат [leiningen - как добавить зависимости для локальных банок?] (Http://stackoverflow.com/questions/2404426/leiningen-how-to-add-dependencies-for-local-jars) –

+2

Это не дубликат * этого вопроса, потому что этот вопрос связан с зависимостями исходного кода и что речь идет конкретно о файле jar. Это может быть дубликат, это просто не дубликат *, который один * –

ответ

2

Нестандартно использовать git-подмодули или локальный подход, основанный на файлах, для управления библиотеками в Clojure. Clojure использует большую часть стандартного экосистемного подхода Java для управления библиотекой. Обычно это связано с созданием и развертыванием библиотек в общедоступном хранилище Maven, таком как Clojars (или Maven Central). Если вы используете это только в своей собственной организации, есть и другие варианты для репозиториев Maven на уровне организации.

Затем вы можете использовать эту библиотеку в своем собственном проекте, объявив ее как зависимость в своем инструменте построения по выбору. В Clojure наиболее распространенным инструментом является Leiningen, и вы объявляете использование этой библиотеки как dependency.

Другие альтернативы - Maven (очень похоже на Leiningen, но в формате XML) или Boot, что требует немного другого подхода.

+0

Разве это серьезно такие большие накладные расходы? Не могу ли я включить свою собственную библиотеку? Должен ли я отключать весь репозиторий для моих библиотек? – squixy

+1

вам не нужно, и я работал с командами, которые не надолго. В конце концов, все они сделали, потому что в долгосрочной перспективе «делать это правильно» экономит время (рискуя) - нет. - –

6

Нет необходимости включать lib как подмодуль git. Вы можете «выпустить» проект моей библиотеки локально.

  1. Просто зайдите в my-library папку проекта и запустить lein pom; lein jar; lein install. Важнейшая часть здесь - lein install, которая устанавливает банку и pom в локальный репозиторий; обычно ~/.m2.

  2. Перейти к вашему проекту, который использует эту библиотеку, и просто объявить его как зависимость в вашем project.clj, как :dependencies [[my-library "version"]], и он должен работать.

EDIT: Simlarly, если вы используете Boot, вы можете запустить boot pom; boot jar; boot install

1

Еще более простое решение заключается в использовании lein checkouts как описано здесь: https://github.com/technomancy/leiningen/blob/master/doc/TUTORIAL.md#checkout-dependencies

Создать реж checkouts в верхний уровень вашего проекта (параллельно директории src). В пределах checkouts просто создайте символическую ссылку на каталог проекта с кодом библиотеки.Для примера рассмотрим проект clj и библиотека tupelo

drwxrwxr-x 10 alan alan 4096 Jan 5 12:09 clj/ 
drwxrwxr-x 11 alan alan 4096 Jan 9 20:01 tupelo/ 

Проект clj будет выглядеть так:

> d clj clj/* clj/checkouts/* 

drwxrwxr-x 10 alan alan 4096 Jan 12 10:36 clj/ 
drwxrwxr-x 2 alan alan 4096 Oct 14 09:23 clj/checkouts/ 
lrwxrwxrwx 1 alan alan 17 Oct 30 16:44 clj/checkouts/tupelo -> /home/alan/tupelo/ 
drwxrwxr-x 2 alan alan 4096 Aug 31 10:05 clj/doc/ 
-rw-rw-r-- 1 alan alan 11219 Aug 31 10:05 clj/LICENSE 
-rw-rw-r-- 1 alan alan 794 Jan 5 12:09 clj/project.clj 
-rw-rw-r-- 1 alan alan 457 Aug 31 10:05 clj/README.md 
drwxrwxr-x 2 alan alan 4096 Jan 3 09:01 clj/resources/ 
drwxrwxr-x 3 alan alan 4096 Aug 31 10:05 clj/src/ 
drwxrwxr-x 8 alan alan 4096 Nov 14 16:26 clj/target/ 
drwxrwxr-x 3 alan alan 4096 Sep 29 22:31 clj/test/ 

Теперь при создании проекта clj, он будет (всегда) использовать исходный код ~/tupelo вместо clojars, maven и т. Д. Это означает, что вам не нужно делать & (повторно) установить банку из lib tupelo каждый раз, когда вы вносите изменения, которые хотите использовать в clj.

+0

Ситуация немного хуже, чем в последнем абзаце. Он всегда будет использовать ваш локальный код ** дополнительно ** к коду от maven. Если вы используете одну версию библиотеки в локальном каталоге проверок, а переходная зависимость загружает одну и ту же библиотеку, сначала загружается одна из maven, затем ваша загружается поверх нее. поэтому не используйте библиотеки с побочными эффектами на верхнем уровне, если вы когда-либо используете проверки. –

Смежные вопросы