Определение пути Clojure Jar - PullRequest
7 голосов
/ 14 марта 2012

Задача этого вопроса - прояснить путаницу с зависимостями Clojure project.clj и указанием локальной зависимости.

У меня есть куча проектов Clojure lein в дереве

./projects/clojure/bene-csv # A csv parsing library
./projects/clojure/bene-cmp # A main program that depends on bene-csv

Я редактирую файл bene.cmp project.clj.Я хочу сделать зависимость от ./projects/clojure/bene-csv/bene-csv-1.0.0-SN.jar.

Должен ли я использовать простую систему обозначений каталогов для указания пути или что-то еще

Спасибо.

Редактировать:

Я могу включить Bene-CSV в моемпроект, введя lein install в каталоге проекта bene-csv и используя эти записи project.clj в файле project.clj каталога проекта bene-cmp:

(defproject bene-cmp "1.0.0-SN"
  :description "This is the main benetrak/GIC comparison program."
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [clojure-csv/clojure-csv "1.3.2"]
                 [bene-csv "1.0.0-SN"]])

Однако я все еще пытаюсь выяснить, чтопуть есть, и был бы признателен за любые указатели или помощь в этом направлении.Спасибо.

1 Ответ

13 голосов
/ 14 марта 2012

Leinigen использует управление зависимостями maven под крышками, поэтому все зависимости устанавливаются в

${HOME}/.m2/repository/${groupId-as-path}/${artifactId}/$[version}/${artifactId}-${version}.jar

, где для [org.clojure/clojure "1.3.0"] идентификатор группы равен org.clojure, идентификатор артефакта равен clojure, а версия 1.3.0. groupIds преобразуются в пути, поэтому groupId org.clojure имеет путь org/clojure.

В зависимости от maven, указанной в pom.xml, это будет выглядеть так:

<project>

    ...    

    <dependencies>
        <dependency>
           <groupId>org.clojure</groupId>
           <artifactId>clojure</artifactId>
           <version>1.3.0</version>
       </dependency>
    </dependencies>

    ...

</project>

Примечание. Если groupId не указан, leiningen использует одинаковые значения для groupId и artifactId.

Преимущество использования управления зависимостями maven заключается в том, что оно обрабатывает переходные зависимости для вас, т.е. если вы укажете зависимость от чего-либо, вы получите все, от чего это зависит, и все, от чего зависят эти вещи и т. д. и т. д.

Поэтому, чтобы зависеть от локального проекта, правильно установить локальный проект в вашем локальном хранилище.

Чтобы вы могли бесконечно менять свои версии на этапе разработки, maven поддерживает зависимости SNAPSHOT, в результате чего к версии добавляется некоторая дополнительная информация (в основном дата и время), и maven знает, что, скажем, 1.3.1-SNAPSHOT она должна выглядеть для последней версии этого снимка. Это вызвано соглашением об именах {version} -SNAPSHOT.

В maven вы можете указывать системные зависимости жестко закодированным путем, но обычно это плохая практика - обычно она используется для вещей, зависящих от платформы, то есть может иметь собственный компонент библиотеки.

По умолчанию выполняется поиск в центральном репозитории maven, и leinigen добавляет в репозиторий clojars , который служит в качестве центрального репозитория для jar-файлов clojure.

leinigen использует этот материал под прикрытием и создает путь к классам, ссылаясь на файлы jar в вашем локальном хранилище maven.

Обратите внимание, что вы можете сгенерировать pom.xml из проекта leinigen с помощью lein pom. Вы могли бы тогда выгнать Maven из этого. Полезная функция

mvn dependency:tree

, который дает ascii art представление всех зависимостей.

...