Quelles sont les conventions courantes pour l’utilisation des espaces de noms dans Clojure?

J’ai du mal à trouver de bons conseils et des pratiques courantes pour l’utilisation des espaces de noms dans Clojure. Je me rends compte que les espaces de noms ne sont pas les mêmes que les packages Java, alors j’essaie de démêler les conventions de Clojure, qui semblent étonnamment difficiles à déterminer.

Je pense que je sais très bien comment diviser les fonctions en fichiers clj et même comment je voudrais organiser ces fichiers en répertoires. Mais au-delà, j’ai du mal à trouver la mécanique pour mon environnement de développement. Quelques questions interdépendantes:

  1. Dois-je utiliser les mêmes conventions d’unicité pour les espaces de noms Clojure que celles que j’utiliserais normalement pour les packages Java? [c.-à-d. backwards-company-domain.project.subsystem]
  2. Dois-je enregistrer mes fichiers dans une structure de répertoires correspondant à mes espaces de noms? [ala Java]
  3. Si j’ai plusieurs espaces de noms, dois-je comstackr tout mon code dans un fichier jar et l’append à mon classpath pour le rendre accessible?
  4. Chaque espace de noms doit-il être compilé en un seul pot? Ou devrais-je créer un fichier jar unique contenant du code clj provenant de nombreux espaces de noms?

Merci…

  1. Je suppose que ça va si vous pensez que ça aide, mais beaucoup de projets Clojure ne le font pas – cf. Compojure (en utilisant un compojure de haut niveau et diverses compojure. * Ns pour des fonctionnalités spécifiques), Ring, Leiningen … Clojure lui-même utilise clojure. * (Et clojure.consortingb. * Pour les bibliothèques consortingb), mais c’est un cas particulier, Je suppose.

  2. Oui! Vous devez absolument le faire, sinon Clojure ne pourra pas trouver vos espaces de noms. Notez également que vous ne devez pas utiliser le trait de soulignement dans les noms d’espace de noms ou le tiret dans les noms de fichiers et où que vous utilisiez un tiret dans un nom d’espace de noms, vous devez utiliser un trait de soulignement dans le fichier. un fichier appelé cool_project.clj dans un répertoire appelé my ).

  3. Vous devez vous assurer que toutes vos données se trouvent dans le classpath, peu importe si elles se trouvent dans un fichier jar, plusieurs fichiers jars, un mélange de fichiers jars et de répertoires sur le système de fichiers. votre point n ° 2), ça devrait aller.

    Cependant, ne comstackz pas les choses à l’avance si vous n’avez pas de raison de le faire – cela pourrait empêcher votre code d’être portable sur différentes versions de Clojure sans offrir des avantages autres qu’un temps de chargement légèrement amélioré.

    Vous devrez toujours utiliser la compilation AOT, notamment dans certains scénarios d’interopérabilité Java – la documentation des fonctions / macros pertinentes le mentionne toujours. Il y a des exemples de choses nécessitant AOT in clojure.consortingb; Je n’en ai jamais eu besoin, alors je ne peux pas fournir beaucoup de détails.

  4. Je dirais que vous devriez utiliser des jars pour les unités fonctionnelles du code. Par exemple, Compojure et Ring sont regroupés dans des jars simples contenant de nombreux espaces de noms qui, ensemble, constituent le package complet. En outre, clojure.consortingb est notamment présenté sous la forme d’un simple jar contenant plusieurs bibliothèques non liées. mais cela peut encore être un cas particulier.

    D’un autre côté, un seul fichier contenant tous les codes de votre projet et ses dépendances peut parfois être utile pour le déploiement. Consultez l’outil de compilation de Leiningen et son outil «uberjar» si vous pensez que ce genre de chose peut vous être utile.

  1. Ssortingctement parlant, pas nécessaire, bien que de nombreux projets Java aient également abandonné cette convention, en particulier pour les projets internes ou les API privées. Evitez toutefois les espaces de noms à segment unique, ce qui entraînerait la génération de fichiers de classe dans le package par défaut.
  2. Oui.

Concernant les 3 & 4, le packaging et la compilation AOT sont entièrement orthogonaux à la question des conventions d’espace de noms.