Как я могу использовать один файл из своего проекта в другом файле?

Простой вопрос. Я плохо знаком с Clojure.

Как я могу использовать один файл из своего проекта в другом файле? В основном, как я могу включать, импортируйте или потребуйте другого файла? Не из библиотек, но fro мой собственный код.

Спасибо, Alex

11
задан Alex Baranosky 17 March 2010 в 01:57
поделиться

1 ответ

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

  1. Следуйте обычной структуре проекта Clojure: каталог src / , содержащий все ваши исходные файлы, где файл src / foo / bar / baz.clj определяет пространство имен foo.bar.baz . Обратите внимание, что вы должны поддерживать соответствие структуры каталогов / структуры имен пространства имен; иначе ничего не получится. Также обратите внимание, что вы не должны использовать символ _ в именах пространств имен или символы - (дефис) в именах файлов и всякий раз, когда вы используете _ в именах файлов вы должны использовать - в именах пространств имен (и наоборот). Наконец, иерархия каталогов будет немного сложнее с проектами Maven, но пока не беспокойтесь об этом ( если вы уже не являетесь опытным пользователем Maven, и в этом случае для вас это не будет проблемой).

    Также см. этот мой ответ на более ранний вопрос SO об обработке пути к классам Java с помощью Clojure для более подробного пошагового объяснения соответствия иерархии файловой системы / иерархии пути к классам.

  2. Если ваш код из foo.пространство имен bar должно использовать код из пространства имен foo.quux.baz , выполните что-то вроде (ns foo.bar (: require [foo.quux.baz: as baz])) в foo / bar.clj и вызовите функции из baz как baz / some-function . Или вы можете поместить (: use foo.quux.baz) в форму ns вместо того, чтобы вызывать их напрямую (без квалификатора пространства имен, например some-function ). Это точно то же самое, что и с кодом библиотеки.

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

Предупреждение: Ваша команда запуска JVM может (фактически, вероятно) распознать переменную среды с именем $ CLASSPATH . Что касается его связи с вашими проектами Clojure, ну, в принципе, их не должно быть. Скорее всего, для каждого из ваших проектов потребуется другой путь к классам, при этом некоторые из них могут использовать версии определенных jar-файлов, несовместимых с теми, которые требуются другим (особенно, если вы используете Clojure 1.1 - последний стабильный выпуск - для некоторых проектов во время экспериментов. с 1.2 снимками с другими).Таким образом, правильный способ управления путем к классам - подготовить минимальную версию для каждого проекта и передать ее команде запуска JVM. Как упоминалось ранее, вам следует потратить некоторое время на то, чтобы научиться использовать хороший инструмент (например, упомянутый выше Leiningen), чтобы как можно скорее настроить путь к классам, чтобы вам не нужно было заботиться об этом самостоятельно.

(В качестве примечания, вам может потребоваться добавить больше, чем просто каталог src / и ваши jar s в путь к классам в некоторых сценариях, например, если вы планируете вызывать скомпилировать для создания файлов .class , вам также придется поместить целевой каталог в путь к классам. Однако это выходит за рамки этого вопроса.)

Кстати, я Я начал этот ответ со слова «обычно», потому что вы также можете использовать такие вещи, как load и in-ns , чтобы разделить одно пространство имен на несколько файлов. Однако в большинстве случаев это не то, чем вы действительно хотите заниматься; просто используйте вместо этого хорошо продуманный макет пространства имен.

24
ответ дан 3 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: