Bevezetés a Clojure-hoz tartozó Leiningen-be

1. Bemutatkozás

A Leiningen egy modern építési rendszer Clojure-projektjeinkhez. Azt is teljesen megírták és konfigurálták a Clojure-ban.

A Maven-hez hasonlóan működik, és deklaratív konfigurációt ad nekünk, amely leírja a projektünket, anélkül, hogy pontos végrehajtási lépéseket kellene konfigurálni.

Ugorjunk be, és nézzük meg, hogyan kezdhetjük el Leiningent a Clojure-projektek építésében.

2. A Leiningen telepítése

A Leiningen önálló letöltésként érhető el, valamint a különféle rendszerek nagyszámú csomagkezelőjétől.

Önálló letöltések állnak rendelkezésre Windows, valamint Linux és Mac operációs rendszerekhez. Minden esetben töltse le a fájlt, tegye futtathatóvá, ha szükséges, és akkor használatra kész.

A szkript első futtatásakor a Leiningen alkalmazás többi részét letölti, majd ezt innentől kezdve gyorsítótárba helyezi:

$ ./lein Leiningen letöltése a /Users/user/.lein/self-installs/leiningen-2.8.3-standalone.jar fájlba most ... ..... A Leiningen a Clojure projektekkel való együttműködés eszköze. Számos feladat áll rendelkezésre: ..... A részletekért futtassa a `lein help $ TASK` fájlt. .....

3. Új projekt létrehozása

A Leiningen telepítése után használhatjuk egy új projekt létrehozására meghívással lein új.

Ez létrehoz egy projektet egy adott sablon felhasználásával a következő lehetőségekből:

  • kb - Alkalmazás létrehozására szolgál
  • alapértelmezett - Általános projektstruktúra létrehozására szolgál, általában könyvtárak számára
  • csatlakoztat - Leiningen bővítmény létrehozására szolgál
  • sablon - Új leiningeni sablonok létrehozására használják a jövőbeli projektekhez

Például egy „my-project” nevű új alkalmazás létrehozásához végrehajtjuk:

$ ./lein új alkalmazás my-project Saját projekt nevű projekt létrehozása az 'app' sablon alapján.

Így kapunk egy projektet, amely a következőket tartalmazza:

  • Építési definíció - project.clj
  • Forrás könyvtár - src - egy kezdeti forrásfájlt is tartalmaz - src / my_project / core.clj
  • Tesztkönyvtár - teszt - tartalmaz egy kezdeti tesztfájlt - test / my_project / core_test.clj
  • Néhány további dokumentációs fájl - README.md, ENGEDÉLY, CHANGELOG.md és doc / intro.md

Az építési definíciónkba belenézve látni fogjuk, hogy ez megmondja, mit kell építeni, de nem arról, hogyan kell felépíteni:

(defproject my-project "0.1.0-SNAPSHOT": leírás "FIXME: írja le a leírást": url "//example.com/FIXME": licenc {: név "EPL-2.0 VAGY GPL-2.0-vagy későbbi WITH Classpath -exception-2.0 ": url" //www.eclipse.org/legal/epl-2.0/ "}: függőségek [[org.clojure / clojure" 1.9.0 "]]: main ^: skip-aot my-project .core: target-path "target /% s": profilok {: uberjar {: aot: all}})

Ez azt mondja nekünk:

  • A projekt részletei, amelyek tartalmazzák a projekt nevét, verzióját, leírását, honlapját és az engedély részleteit.
  • Az alkalmazás futtatásakor használandó fő névtér
  • A függőségek listája
  • A kimenet beépítéséhez használt elérési út
  • Profil egy uberjar építéséhez

Vegye figyelembe, hogy a fő forrásnév a my-project.core, és megtalálható a fájlban my_project / core.clj. A Clojure-ban nem javasolt egyszegmenses névterek használata - a Java-projekt felső szintű osztályainak megfelelője.

Ezenkívül a fájlneveket kötőjelek helyett aláhúzással generálják, mert a JVM-nek problémái vannak a fájlnevekben szereplő kötőjelekkel.

A létrehozott kód nagyon egyszerű:

(ns my-project.core (: gen-class)) (defn -main "Nem csinálok még sokat ... még." [& args] (println "Hello, világ!")

Figyelje meg azt is, hogy a Clojure itt csak függőség. Ez elenyészővé teszi a projektek írását a Clojure könyvtárak bármelyik verziójának felhasználásával, és különösen, hogy több különböző verzió futjon ugyanazon a rendszeren.

Ha megváltoztatjuk ezt a függőséget, akkor helyette az alternatív verziót kapjuk.

4. Építés és futás

A projektünk nem ér sokat, ha nem tudjuk megépíteni, futtatni és csomagolni terjesztés céljából, ezért nézzük meg ezt a következőt.

4.1. A REPL elindítása

Ha van egy projektünk, akkor a REPL-t elindíthatjuk benne lein repl. Ez egy olyan REPL-t fog kapni, amelynek minden része a projektben már elérhető az osztályúton - beleértve az összes projektfájlt és az összes függőséget.

Ez is elindít minket a projektünk fő fő névterében:

A $ lein repl nREPL kiszolgáló a 62856 porton indult a 127.0.0.1 hoszton - nrepl: //127.0.0.1: 62856 [] REPL-y 0.4.3, nREPL 0.5.3 Clojure 1.9.0 Java HotSpot (TM) 64 bites szerver VM 1.8.0_77-b03 Dokumentumok: (doc function-name-here) (find-doc "name-name-here") Forrás: (source function-name-here) Javadoc: (javadoc java-object-or- class-here) Exit: Control + D vagy (exit) vagy (quit) Eredmények: * 1, * 2, * 3 varsban tárolva, kivétel a * e my-project.core => (-main) Hello, World ! nulla

Ez végrehajtja a funkciót -fő a jelenlegi névtérben, amelyet fentebb láttunk.

4.2. Az alkalmazás futtatása

Ha egy alkalmazási projekten dolgozunk - a lein új alkalmazás - azután egyszerűen futtathatjuk az alkalmazást a parancssorból. Ez a használatával történik lein futni:

$ lein run Hello, Világ!

Ez végrehajtja az úgynevezett függvényt -fő névvel definiált névtérben :fő miénkben project.clj fájl.

4.3. Könyvtár építése

Ha egy könyvtári projekten dolgozunk - a lein új alapértelmezett - azután beépíthetjük a könyvtárat egy JAR fájlba más projektekbe való felvétel céljából.

Kétféleképpen érhetjük el ezt - felhasználva lein jar vagy lein telepíteni. A különbség egyszerűen abban áll, hogy hova kerül a kimeneti JAR fájl.

Ha használjuk lein jar akkor a helyben fogja elhelyezni cél Könyvtár:

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

Ha használjuk lein telepíteni, akkor felépíti a JAR fájlt, létrehoz egy pom.xml fájlt, majd helyezze a kettőt a helyi Maven-tárba (jellemzően a .m2 / adattár a felhasználók saját könyvtárában)

$ lein install Létrehozva /Users/user/source/me/my-library/target/my-library-0.1.0-SNAPSHOT.jar Wrote /Users/user/source/me/my-library/pom.xml Telepített jar és pom a helyi repóba.

4.4. Uberjar építése

Ha egy pályázati projekten dolgozunk, Leiningen lehetőséget nyújt arra, hogy felépítsük az úgynevezett uberjar-t. Ez egy JAR fájl, amely magában foglalja a projektet és az összes függőséget, és úgy van beállítva, hogy lehetővé tegye a jelenlegi állapotát.

$ lein uberjar My-project.core fordítása Létrehozva /Users/user/source/me/my-project/target/uberjar/my-project-0.1.0-SNAPSHOT.jar Created / Users / user / source / me / my- project / target / uberjar / my-project-0.1.0-SNAPSHOT-standalone.jar

A fájl my-project-0.1.0-SNAPSHOT.jar egy JAR fájl, amely pontosan a helyi projektet és a fájlt tartalmazza my-project-0.1.0-SNAPSHOT-standalone.jar mindent tartalmaz, ami az alkalmazás futtatásához szükséges.

$ java -jar target / uberjar / my-project-0.1.0-SNAPSHOT-standalone.jar Hello, Világ!

5. Függőségek

Bár mindent megírhatunk a projektünkhöz, mi magunk írhatjuk meg, általában jobb, ha újra felhasználjuk azt a munkát, amelyet mások már elvégeztek a nevünkben. Ezt úgy tehetjük meg, hogy a projektünk függ ezen más könyvtáraktól.

5.1. Függőségek hozzáadása a projektünkhöz

A függőségek hozzáadásához a projektünkhöz helyesen kell hozzáadnunk őket a sajátunkhoz project.clj fájl.

A függőségeket egy vektor képezi, amely a kérdéses függőség nevét és változatát tartalmazza. Már láttuk, hogy maga a Clojure is függőségként kerül hozzáadásra, formában megírva [org.clojure / clojure „1.9.0”].

Ha további függőségeket akarunk hozzáadni, akkor megtehetjük úgy, hogy hozzáadjuk őket a : függőségek kulcsszó. Például, ha attól akarunk függeni clj-json frissítenénk a fájlt:

 : függőségek [[org.clojure / clojure "1.9.0"] [clj-json "0.5.3"]]

Ha elkészült, ha elindítjuk a REPL-t - vagy bármilyen más módon építjük vagy futtatjuk a projektünket -, akkor Leiningen biztosítja, hogy a függőségek letölthetők és elérhetők legyenek az osztályúton:

$ lein repl A clj-json / clj-json / 0.5.3 / clj-json-0.5.3.pom letöltése a clojars-ból A clj-json / clj-json / 0.5.3 / clj-json-0.5.3.jar letöltése a következőből: clojars Az nREPL kiszolgáló a 62146 porton indult a 127.0.0.1 hoszton - nrepl: //127.0.0.1: 62146 REPL-y 0.4.3, nREPL 0.5.3 Clojure 1.9.0 Java HotSpot (TM) 64 bites kiszolgáló virtuális gép 1.8.0_77 -b03 Dokumentumok: (doc függvény-név-itt) (keresd-doc "név-név-itt") Forrás: (forrás függvény-név-itt) Javadoc: (javadoc java-objektum vagy osztály-itt) Kilépés: Control + D vagy (exit) vagy (kilépés) Eredmények: * 1, * 2, * 3 varsban tárolva, kivétel a * e my-project.core => (megkövetelni '(megköveteli' (clj-json [core: as json])) nulla my-project.core => (json / generator-string {"foo" "bar"}) "{\" foo \ ": \" bar \ "}" my-project.core =>

Projektünk belsejéből is felhasználhatjuk őket. Frissíthetjük például a létrehozottakat src / my_project / core.clj fájl az alábbiak szerint:

(ns my-project.core (: gen-class)) (igényel '(clj-json [core: mint json])) (defn -main "Nem csinálok még sokat ...". args] (println (json / generator-string {"foo" "bar"})))

És akkor a futtatása pontosan a várt módon fog megtörténni:

$ lein run {"foo": "bár"}

5.2. Függőségek keresése

Gyakran nehéz lehet megtalálni a projektünk során használni kívánt függőségeket. Leiningen beépített keresési funkcióval rendelkezik hogy ezt megkönnyítsem. Ez a használatával történik lein keresés.

Megtalálhatjuk például JSON könyvtárunkat:

$ lein search json Keresés központban ... [com.jwebmp / ​​json "0.63.0.60"] [com.ufoscout.coreutils / json "3.7.4"] [com.github.iarellano / json "20190129"] ... .. Clojars keresése ... [cheshire "5.8.1"] JSON és JSON SMILE kódolás, gyors. [json-html "0.4.4"] Adja meg a JSON-t, és kap egy DOM-csomópontot annak a JSON-nak az emberi ábrázolásával. 3 "] Gyors JSON kódolás és dekódolás Clojure számára a Jackson könyvtáron keresztül. .....

Ez megkeresi az összes tárat, amelyekkel a projektünk dolgozik - ebben az esetben a Maven Central és a Clojars. Ezután visszaküldi a pontos karakterláncot, amelyet be kell rakni project.clj fájlt, és ha rendelkezésre áll, a könyvtár leírását.

6. Projektünk tesztelése

A Clojure beépített támogatást nyújt az alkalmazásunk teszteléséhez, és Leiningen ezt felhasználhatja projektjeinkhez.

A létrehozott projektünk tesztkódot tartalmaz a teszt könyvtárban, a forráskód mellett a src Könyvtár. Ez magában foglal egy alapértelmezés szerint egyetlen, sikertelen tesztet is test / my_project / core-test.clj:

(ns my-project.core-test (: igényel [clojure.test: hivatkozás: minden] [my-project.core: hivatkozás: minden])) (deftest egy teszt (tesztelés "FIXME, nem sikerül." (is (= 0 1))))

Ez importálja a my-project.core névtér a projektünkből, és a clojure.teszt névtér az alapvető Clojure nyelvből. Ezután meghatározunk egy tesztet a ügyes és tesztelés hívások.

Rögtön láthatjuk a teszt nevét, és azt a tényt, hogy szándékosan írták kudarcra - ezt állítja 0 == 1.

Futtassuk ezt a lein teszt parancs, és azonnal nézze meg a tesztek futtatását és sikertelenségét:

$ lein teszt lein teszt my-project.core-test lein teszt: csak a my-project.core-test / a-test FAIL a (a-test) -ben (core_test.clj: 7) FIXME, nem sikerül. várható: (= 0 1) tényleges: (nem (= 0 1)) 1 tesztet végzett, 1 állítást tartalmazva. 1 hiba, 0 hiba. A tesztek nem sikerültek.

Ha ehelyett kijavítjuk a tesztet, megváltoztatjuk azt, hogy ezt állítsuk 1 == 1 ehelyett továbbító üzenetet kapunk helyette:

$ lein teszt lein teszt my-project.core-test Ran 1 teszt 1 állítást tartalmaz. 0 hiba, 0 hiba.

Ez sokkal tömörebb kimenet, csak azt mutatja meg, amit tudnunk kell. Ez azt jelenti amikor kudarcok vannak, azonnal kitűnnek.

Ha akarjuk, a tesztek egy meghatározott részhalmazát is lefuttathatjuk. A parancssor lehetővé teszi névtér megadását, és csak az adott névtérben végrehajtott teszteket hajtják végre:

$ lein teszt my-project.core-test lein teszt my-project.core-test Ran 1 teszt tartalmaz 1 állítást. 0 hiba, 0 hiba. $ lein teszt my-project.unknown lein teszt my-project.unknown Ran 0 teszt tartalmaz 0 állítást. 0 hiba, 0 hiba.

7. Összegzés

Ez a cikk megmutatta, hogyan kell elindulni a Leiningen build eszközzel, és hogyan lehet használni Clojure alapú projektjeink - futtatható alkalmazások és megosztott könyvtárak - kezelésére.

Miért ne próbálja ki a következő projektben, és nézze meg, mennyire működik?