Как я могу использовать один файл из моего проекта в другом файле? - PullRequest
11 голосов
/ 17 марта 2010

Простой вопрос. Я новичок в Clojure.

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

Спасибо, Alex

1 Ответ

24 голосов
/ 17 марта 2010

Обычно вы хотите использовать тот же метод, который вы используете с библиотечным кодом, то есть use / require ваших пространств имен (через форму ns вверху файла и иногда * 1004). * / require работает в режиме 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/ (сам каталог, а не любые файлы в нем) в classpath. Возможно, вам следует рассмотреть возможность использования некоторых инструмент для автоматизации установки REPL (включая управление classpath) для вас; Leiningen очень популярен среди Clojurians, и есть плагины для использования Maven с Clojure.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...