Ошибка при совместном использовании пространства имен между файлами, использующими (in-ns) - PullRequest
0 голосов
/ 13 апреля 2020

Я разделяю пространство имен между всеми моими кольцевыми маршрутами, чтобы сохранить каждый маршрут в отдельном файле, поэтому у меня есть файл routes/core.clj, который содержит:

(ns test-proxy.routes.core)
;; Some utility functions

Затем я запускаю каждый обработчик маршрута файл вроде этого:

(in-ns 'test-proxy.routes.core)
;; rest of the code

Когда я запускаю сервер, он работает отлично.

Но когда я изменяю любой из файлов и перезагружаю страницу в браузере, я получаю следующую ошибку:

Caused by: java.lang.Exception: Found lib name 'test-proxy.routes.core' 
containing period with prefix 'quote'.  lib names inside prefix lists 
must not contain periods

Если я перезагружаю сервер вручную (lein ring server ), все работает снова, как и ожидалось, но как только я делаю еще одно изменение в базе кода, происходит сбой с той же ошибкой. Это определенно связано с тем, как я использую пространства имен, но что меня привлекает, так это то, что он работает без проблем при перезапуске сервера.

Если я удаляю пространство имен в (in-ns test-proxy.routes.core), как кажется, ошибка предположим, сервер даже не запускается:

Syntax error (ClassNotFoundException) compiling at (diplomat/routes/docs.clj:1:1).
test-proxy.routes.core

1 Ответ

1 голос
/ 13 апреля 2020

in-ns предназначен только для использования в REPL.

Можно разделить ваши функции так, как вы хотите. Просто используйте полное имя, например some.ns.of.mine/my-fn, когда вы ссылаетесь на функцию из любого другого пространства имен.

Конечно, вы всегда можете использовать псевдоним пространства имен, например:

(ns some.other.ns.of.mine 
  (:require [some.ns.of.mine :as snom]))   ; define namespace alias

....

  (snom/my-fn ...)   ; invoke the fn

Убедитесь, что Как узнать

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