2016-02-14 8 views
0

Для развития библиотеки я начал с проектом LEIN, вызываемая как так:библиотека доступа функция Leiningen РЕПЛ

lein new mylib 

, если я позвоню lein install сейчас, я могу получить доступ к библиотеке и в других проектах. Но попытка immidiately протестировать функции я писал ошибку:

lein repl 
... 
(dir mylib.core) 
Exception No namespace: mylib.core found clojure.core/the-ns (core.clj:4008) 

ли я что-то добавить в файл project.clj может быть?

+1

В каком пространстве имен используется REPL? Я обычно переключаюсь через '(in-ns NAME)'. –

+0

dir также должен работать из других пространств имен. Тем не менее, попытка (in-ns ..) вызывает ту же ошибку, о которой упоминалось выше ... –

+0

'in-ns' даст вам, казалось бы, неиспользуемую repl, если вы запустите перед загрузкой этого кода пространства имен. '(clojure.core/refer-clojure)' спасет repl от этого состояния. – noisesmith

ответ

0

Вам нужно добавить зависимость, чтобы использовать вашу библиотеку из другого проекта. Для этого добавьте вектор (кортеж-2) к вектору, который является значением ключа :dependencies в файле project.clj. Вот пример:

:dependencies [[org.clojure/clojure "1.7.0"] 
       [org.clojure/clojurescript "1.7.170"] 
       [org.clojure/core.async "0.2.371"] 
       [default-db-format "0.1.0-SNAPSHOT"] 
       [com.andrewmcveigh/cljs-time "0.3.14"]] 

Моя собственная локальная библиотека называется default-db-format. Это действительно не отличается от добавления зависимости для com.andrewmcveigh/cljs-time.

Как вы говорите, вы уже можете это сделать, но возникают проблемы с подключением REPL к проекту самой библиотеки. Когда вы идете (in-ns 'some-path), вам нужна одиночная кавычка перед some-path. Обратите внимание, что некоторая дорожка - это совсем другое дело с именем вашей библиотеки.

Вместо того, чтобы использовать lein repl, вы можете использовать фигурную замену - если ваш проект настроен с помощью маховика. Моя библиотека имеет только одну точку входа, и это lein figwheel devcards. После этого у меня не было никаких проблем, собираются в пространство имен и опробовать функцию:

cljs.user=> (in-ns 'default-db-format.core) 
nil 
default-db-format.core=> (check 1 2) 

Как noisesmith упоминался, имеющий REPL в вашем IDE является лучшей настройкой. Невозможно набирать текст с помощью нажатия кнопки (или нажатия клавиши) только предварительно настроенные REPL (на пространство имен). Инструкции по настройке Figwheel/Cursive here.

+0

К сожалению, я продолжаю получать ту же ошибку после добавления моей собственной библиотеки к зависимостям, как описано в вашем примере. –

+0

Да - мне не очень нравится/использую 'lein repl'. Отвечая на этот вопрос перед тестированием, как обычно! Я исследую это с помощью figwheel, который также дает вам «repl». –

+0

лейн устанавливает работы/не дает мне ошибок. что было бы, если в зависимостях было что-то не так. Figwheel - это классная вещь, но для приложений для веб-разработки/или nodejs - по крайней мере, я так и думал. –

1

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

Вы можете легко сделать это в ns декларации в файле, конечно, но в РЕПЛ может быть проще в использовании (require '[my-lib.whatever :as w]), после которого можно назвать (w/foo)(w/bar) и т.д., как и ожидалось. Вы также можете использовать (in-ns 'my-lib.whatever), чтобы переключиться на пространство имен, но это не даст вам хорошего результата, если вы ранее не использовали require или use или load-file и т. Д., Чтобы сначала получить определения.

+0

Интересно, что с Figwheel '(in-ns 'my-lib.whatever)' все, что вам нужно сделать. См. [Здесь] (https://github.com/bhauman/lein-figwheel#using-the-clojurescript-repl). –

+0

Это потому, что figwheel предварительно загружает ns для вас. Вы не можете гарантировать, что каждая конфигурация делает это (и опечатки в форме ns могут прервать это, даже если ваш конфиг прав). – noisesmith

0

Предположим, вы создали новую библиотеку с именем clj-foo.

% lein new clj-foo 

Запустите свой вопрос.

% cd clj-foo 
% lein repl 

В реплике загрузите главную точку входа в свою библиотеку и переключитесь на ее пространство имен.

(load-file "src/clj_foo/core.clj") 
(ns clj-foo.core) 

Теперь вы в clj-foo.core пространстве имен, убедитесь, чтобы добавить обратно в Repl нс, чтобы получить такие вещи, как doc доступны.

(use 'clojure.repl) 

Всё. Вы все настроены на запуск функций в вашей библиотеке. Обратите внимание, что другие файлы библиотеки будут доступны из пространства имен clj-foo.core, если они были загружены объявлением пространства имен в верхней части clj_foo/core.clj. Если нет, тогда вам нужно будет также вызвать load-file.

Если вы вносите изменения в core.clj. Вы можете снова вызвать load-file, чтобы получить новый код. По мере продвижения вы можете использовать сидр для облегчения загрузки отдельных функций и файлов. Но это еще один вопрос. :)