Úvod do Leiningenu pre Clojure

1. Úvod

Leiningen je moderný systém budovania pre naše projekty Clojure. Je to tiež napísané a nakonfigurované celé v Clojure.

Funguje to podobne ako v Mavene a dáva nám deklaratívnu konfiguráciu, ktorá popisuje náš projekt, bez potreby konfigurovať presné kroky, ktoré sa majú vykonať.

Poďme sa pozrieť a uvidíme, ako začať s Leiningenom pri budovaní našich projektov Clojure.

2. Inštalácia Leiningenu

Leiningen je k dispozícii ako samostatný súbor na stiahnutie, ako aj od veľkého počtu správcov balíkov pre rôzne systémy.

Samostatné súbory na stiahnutie sú k dispozícii pre Windows, ako aj pre Linux a Mac. Vo všetkých prípadoch súbor stiahnite, v prípade potreby urobte spustiteľný a potom je pripravený na použitie.

Pri prvom spustení skriptu sa stiahne zvyšok aplikácie Leiningen a táto sa bude od tohto bodu ukladať do medzipamäte:

$ ./lein Sťahovanie Leiningenu na /Users/user/.lein/self-installs/leiningen-2.8.3-standalone.jar teraz ... ..... Leiningen je nástroj na prácu s projektmi Clojure. K dispozícii je niekoľko úloh: ..... Podrobnosti zobrazíte spustením aplikácie „lein help $ TASK`. .....

3. Vytvorenie nového projektu

Akonáhle je Leiningen nainštalovaný, môžeme ho použiť na vytvorenie nového projektu vyvolaním Lein nový.

Týmto sa vytvorí projekt pomocou konkrétnej šablóny zo sady možností:

  • aplikácia - Používa sa na vytvorenie aplikácie
  • predvolené - Používa sa na vytvorenie všeobecnej štruktúry projektu, zvyčajne pre knižnice
  • zapojiť - Používa sa na vytvorenie doplnku Leiningen
  • šablóna - Používa sa na vytvorenie nových šablón Leiningen pre budúce projekty

Napríklad na vytvorenie novej aplikácie s názvom „môj-projekt“ by sme vykonali:

$ ./lein nová aplikácia môj projekt Vytvorenie projektu s názvom môj projekt na základe šablóny aplikácie.

Toto nám dáva projekt, ktorý obsahuje:

  • Definícia zostavy - projekt.clj
  • Zdrojový adresár - src - vrátane počiatočného zdrojového súboru - src / my_project / core.clj
  • Testovací adresár - test - vrátane úvodného testovacieho súboru - test / my_project / core_test.clj
  • Niektoré ďalšie súbory dokumentácie - README.md, LICENCIA, CHANGELOG.md a doc / intro.md

Keď sa pozrieme do našej definície zostavenia, uvidíme, že nám hovorí, čo máme stavať, ale nie ako to máme stavať:

(defproject my-project "0.1.0-SNAPSHOT": description "FIXME: write description": url "//example.com/FIXME": license {: name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath -exception-2.0 ": url" //www.eclipse.org/legal/epl-2.0/ "}: závislosti [[org.clojure / clojure" 1.9.0 "]]: main ^: skip-aot my-project .core: target-path "target /% s": profiles {: uberjar {: aot: all}})

Toto nám hovorí:

  • Podrobnosti o projekte pozostávajúce z názvu projektu, verzie, popisu, domovskej stránky a podrobností o licencii.
  • Hlavný priestor názvov, ktorý sa má použiť pri spustení aplikácie
  • Zoznam závislostí
  • Cieľová cesta, do ktorej sa má zabudovať výstup
  • Profil pre stavbu uberjar

Všimnite si, že hlavný priestor názvov zdrojov je my-project.core, a nachádza sa v súbore my_project / core.clj. V Clojure sa neodporúča používať jednosegmentové menné priestory - ekvivalent tried najvyššej úrovne v projekte Java.

Názvy súborov sa navyše generujú s podčiarknutiami namiesto pomlčiek, pretože JVM má určité problémy s pomlčkami v názvoch súborov.

Vygenerovaný kód je dosť jednoduchý:

(ns my-project.core (: gen-class)) (defn -main "Nerobím toho veľa ... zatiaľ." [& args] (println "Hello, World!"))

Všimnite si tiež, že Clojure je tu iba závislosť. Vďaka tomu je triviálne písať projekty pomocou ľubovoľnej verzie knižníc Clojure, ktorá sa požaduje, a najmä mať v rovnakom systéme spustených viac rôznych verzií.

Ak túto závislosť zmeníme, dostaneme namiesto toho alternatívnu verziu.

4. Stavba a beh

Náš projekt nestojí za veľa, ak ho nemôžeme postaviť, spustiť a zabaliť na distribúciu, takže sa na to pozrime ďalej.

4.1. Spustenie REPL

Keď máme projekt, môžeme v ňom spustiť REPL pomocou lein repl. Získate tým REPL, ktorý má v projekte classpath už k dispozícii všetko v projekte - vrátane všetkých projektových súborov a všetkých závislostí.

Začína nás to tiež v definovanom hlavnom mennom priestore pre náš projekt:

$ lein repl nREPL server spustený na porte 62856 na hostiteľovi 127.0.0.1 - nrepl: //127.0.0.1: 62856 [] REPL-y 0.4.3, nREPL 0.5.3 Clojure 1.9.0 Java HotSpot (TM) 64-bitový server VM 1.8.0_77-b03 Docs: (doc function-name-here) (find-doc "part-of-name-here") Zdroj: (zdroj function-name-here) Javadoc: (javadoc java-object-or- trieda-tu) Ukončenie: Control + D alebo (ukončenie) alebo (ukončenie) Výsledky: Uložené vo vars * 1, * 2, * 3, výnimka v * e my-project.core => (-main) Hello, World ! nula

Týmto sa vykoná funkcia -hlavný v súčasnom mennom priestore, ktorý sme videli vyššie.

4.2. Spustenie aplikácie

Pokiaľ pracujeme na aplikačnom projekte - vytvorenom pomocou lein nová aplikácia - potom aplikáciu môžeme jednoducho spustiť z príkazového riadku. To sa deje pomocou lein beh:

$ lein run Ahoj, svet!

Týmto sa spustí volaná funkcia -hlavný v mennom priestore definovanom ako :hlavný v našom projekt.clj spis.

4.3. Budovanie knižnice

Ak pracujeme na projekte knižnice - vytvorený pomocou lein nové predvolené - potom môžeme postaviť knižnicu do súboru JAR na zahrnutie do ďalších projektov.

Máme dva spôsoby, ako to môžeme dosiahnuť - použitie lein jar alebo lein nainštalovať. Rozdiel je jednoducho v tom, kde je umiestnený výstupný súbor JAR.

Ak použijeme lein jar potom ho umiestni do miestnej cieľ adresár:

$ lein jar Vytvorené /Users/user/source/me/my-library/target/my-library-0.1.0-SNAPSHOT.jar

Ak použijeme lein nainštalovať, potom vytvorí súbor JAR a vygeneruje pom.xml súbor a potom ich vložte do miestneho úložiska Maven (zvyčajne pod .m2 / úložisko v domovskom adresári používateľov)

$ lein install Vytvorené /Users/user/source/me/my-library/target/my-library-0.1.0-SNAPSHOT.jar Napísal /Users/user/source/me/my-library/pom.xml Nainštalovaný jar a pom do miestneho repa.

4.4. Budovanie Uberjaru

Ak pracujeme na aplikačnom projekte, Leiningen nám dáva schopnosť vybudovať to, čo sa nazýva uberjar. Toto je súbor JAR, ktorý obsahuje samotný projekt a všetky závislosti a je nastavený tak, aby umožňoval jeho spustenie tak, ako je.

$ lein uberjar Vytvorenie kompilácie my-project.core Vytvorené /Users/user/source/me/my-project/target/uberjar/my-project-0.1.0-SNAPSHOT.jar Vytvorené / Používatelia / používateľ / zdroj / ja / môj- project / target / uberjar / my-project-0.1.0-SNAPSHOT-standalone.jar

Súbor my-project-0.1.0-SNAPSHOT.jar je súbor JAR obsahujúci presne lokálny projekt a súbor my-project-0.1.0-SNAPSHOT-standalone.jar obsahuje všetko potrebné na spustenie aplikácie.

$ java -jar target / uberjar / my-project-0.1.0-SNAPSHOT-standalone.jar Dobrý deň, svet!

5. Závislosti

Aj keď môžeme napísať všetko potrebné pre náš projekt sami, je všeobecne výrazne lepšie znovu použiť prácu, ktorú už v našom mene vykonali iní. Môžeme to dosiahnuť tak, že náš projekt bude závisieť od týchto ďalších knižníc.

5.1. Pridanie závislostí do nášho projektu

Ak chcete do nášho projektu pridať závislosti, musíme ich správne pridať do nášho projekt.clj spis.

Závislosti sú reprezentované ako vektor pozostávajúci z názvu a verzie príslušnej závislosti. Už sme videli, že samotný Clojure je pridaný ako závislosť, napísaná vo forme [org.clojure / clojure “1.9.0”].

Ak chceme pridať ďalšie závislosti, urobíme to tak, že ich pridáme do vektora vedľa : závislosti kľúčové slovo. Napríklad, ak sa chceme spoľahnúť na clj-json aktualizovali by sme súbor:

 : závislosti [[org.clojure / clojure "1.9.0"] [clj-json "0.5.3"]]

Po dokončení, ak začneme náš REPL - alebo akýmkoľvek iným spôsobom, ako zostaviť alebo spustiť náš projekt - potom Leiningen zabezpečí, aby sa závislosti stiahli a boli k dispozícii na triednej ceste:

$ lein repl Načítanie clj-json / clj-json / 0.5.3 / clj-json-0.5.3.pom z clojars Načítanie clj-json / clj-json / 0.5.3 / clj-json-0.5.3.jar z server clojars nREPL spustený na porte 62146 na hostiteľovi 127.0.0.1 - nrepl: //127.0.0.1: 62146 REPL-y 0.4.3, nREPL 0.5.3 Clojure 1.9.0 Java HotSpot (TM) 64-bitový server VM 1.8.0_77 -b03 Docs: (doc function-name-here) (find-doc "part-of-name-here") Zdroj: (zdroj function-name-here) Javadoc: (javadoc java-objekt-alebo-trieda-tu) Ukončenie: Control + D alebo (ukončenie) alebo (ukončenie) Výsledky: Uložené vo vars * 1, * 2, * 3, výnimka v * e my-project.core => (require '(clj-json [core: as json])) nil my-project.core => (json / generate-string {"foo" "bar"}) "{\" foo \ ": \" bar \ "}" my-project.core =>

Môžeme ich tiež použiť z vnútra nášho projektu. Mohli by sme napríklad aktualizovať vygenerované src / my_project / core.clj súbor nasledovne:

(ns my-project.core (: gen-class)) (require '(clj-json [core: as json])) (defn -main "Nerobím toho veľa ... zatiaľ." [& args] (println (json / generate-string {"foo" "bar"})))

A potom sa spustí presne podľa očakávaní:

$ lein run {"foo": "bar"}

5.2. Hľadanie závislostí

Často môže byť ťažké nájsť závislosti, ktoré chceme použiť v našom projekte. Leiningen prichádza s integrovanou funkciou vyhľadávania aby sme to uľahčili. To sa deje pomocou lein hľadanie.

Môžeme napríklad nájsť naše knižnice JSON:

$ lein search json Centrum vyhľadávania ... [com.jwebmp / ​​json "0.63.0.60"] [com.ufoscout.coreutils / json "3.7.4"] [com.github.iarellano / json "20190129"] ... .. Hľadám clojars ... [cheshire "5.8.1"] kódovanie JSON a JSON SMILE, rýchle. [json-html "0.4.4"] Poskytnite JSON a získajte uzol DOM s ľudskou reprezentáciou tohto JSON [ring / ring-json "0.5.0-beta1"] Ring middleware na spracovanie JSON [clj-json "0.5. 3 "] Rýchle kódovanie a dekódovanie JSON pre Clojure prostredníctvom Jacksonovej knižnice. .....

Toto prehľadá všetky úložiská, s ktorými náš projekt pracuje - v tomto prípade Maven Central a Clojars. Potom vráti presný reťazec, ktorý má byť vložený do nášho projekt.clj súbor a popis knižnice, ak je k dispozícii.

6. Testovanie nášho projektu

Clojure má zabudovanú podporu pre testovanie jednotiek našej aplikácie a Leiningen to môže využiť pre naše projekty.

Náš vygenerovaný projekt obsahuje testovací kód v test adresár spolu so zdrojovým kódom v priečinku src adresár. Zahŕňa tiež jeden štandardne zlyhávajúci test - nájdený v test / my_project / core-test.clj:

(ns my-project.core-test (: require [clojure.test: refer: all] [my-project.core: refer: all])) (šikovný a-test (testovanie „FIXME, zlyhám.“) (je (= 0 1))))

Týmto sa dováža my-project.core menný priestor z nášho projektu a clojure.test menný priestor z hlavného jazyka Clojure. Potom definujeme test s obratne a testovanie hovory.

Okamžite vidíme názvy testu a skutočnosť, že je zámerne napísaný tak, aby zlyhal - to tvrdí 0 == 1.

Spustíme to pomocou lein test príkaza okamžite uvidíte, že testy prebiehajú a zlyhávajú:

$ lein test lein test my-project.core-test lein test: iba môj-project.core-test / a-test FAIL in (a-test) (core_test.clj: 7) FIXME, zlyhám. Očakávané: (= 0 1) skutočné: (nie (= 0 1)) Vykonal 1 test obsahujúci 1 tvrdenie. 1 zlyhanie, 0 chýb. Testy zlyhali.

Ak test namiesto toho opravíme, zmeníme ho tak, aby to tvrdil 1 == 1 namiesto toho dostaneme namiesto toho správu:

$ lein test lein test my-project.core-test Spustil 1 testov obsahujúcich 1 tvrdenie. 0 zlyhaní, 0 chýb.

Toto je oveľa stručnejší výstup, ktorý ukazuje iba to, čo potrebujeme vedieť. To znamená, že keď dôjde k poruchám, okamžite vyniknú.

Ak chceme, môžeme spustiť aj konkrétnu podmnožinu testov. Príkazový riadok umožňuje poskytnutie menného priestoru a vykonajú sa iba testy v tomto mennom priestore:

$ lein test my-project.core-test lein test my-project.core-test Spustil 1 testov obsahujúcich 1 tvrdenie. 0 zlyhaní, 0 chýb. $ lein test my-project.unknown lein test my-project.unknown Spustil 0 testov obsahujúcich 0 tvrdení. 0 zlyhaní, 0 chýb.

7. Zhrnutie

Tento článok ukázal, ako začať s nástrojom na zostavenie Leiningenu a ako ho používať na správu našich projektov založených na Clojure - spustiteľné aplikácie aj zdieľané knižnice.

Prečo to nevyskúšať v ďalšom projekte a zistiť, ako dobre to môže fungovať.


$config[zx-auto] not found$config[zx-overlay] not found