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:
Merci…
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.
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
).
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.
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.
Concernant les 3 & 4, le packaging et la compilation AOT sont entièrement orthogonaux à la question des conventions d’espace de noms.