Uvod u Leiningen za Clojure

1. Uvod

Leiningen je moderan sustav gradnje za naše projekte Clojure. Također je u potpunosti napisan i konfiguriran u Clojureu.

Radi slično kao Maven, dajući nam deklarativnu konfiguraciju koja opisuje naš projekt, bez potrebe za konfiguriranjem točnih koraka koji će se izvršiti.

Uđimo i pogledajte kako započeti s Leiningenom za izgradnju naših Clojure projekata.

2. Instaliranje Leiningena

Leiningen je dostupan kao samostalno preuzimanje, kao i od velikog broja upravitelja paketa za različite sustave.

Samostalna preuzimanja dostupna su za Windows, kao i za Linux i Mac. U svim slučajevima preuzmite datoteku, po potrebi je učinite izvršnom i spremna je za upotrebu.

Prvi put kad se skripta pokrene, preuzet će ostatak aplikacije Leiningen, a zatim će se to predmemorirati od ovog trenutka naprijed:

$ ./lein Preuzimanje Leiningena na /Users/user/.lein/self-installs/leiningen-2.8.3-standalone.jar sada ... ..... Leiningen je alat za rad s Clojure projektima. Dostupno je nekoliko zadataka: ..... Pokrenite `lein help $ TASK` za detalje. .....

3. Stvaranje novog projekta

Jednom kada je Leiningen instaliran, pomoću njega možemo stvoriti novi projekt pozivanjem lein novo.

Ovo stvara projekt pomoću određenog predloška iz niza opcija:

  • app - Koristi se za stvaranje aplikacije
  • zadano - Koristi se za stvaranje opće strukture projekta, obično za knjižnice
  • uključiti - Koristi se za stvaranje dodatka Leiningen
  • predložak - Koristi se za izradu novih Leiningenovih predložaka za buduće projekte

Na primjer, za stvaranje nove aplikacije nazvane “moj-projekt” izvršili bismo:

$ ./lein nova aplikacija my-project Generiranje projekta nazvanog my-project na temelju predloška 'app'.

To nam daje projekt koji sadrži:

  • Definicija gradnje - projekt.clj
  • Izvorni direktorij - src - uključujući početnu izvornu datoteku - src / my_project / core.clj
  • Probni direktorij - test - uključujući početnu testnu datoteku - test / my_project / core_test.clj
  • Neke dodatne datoteke s dokumentacijom - README.md, LICENCA, CHANGELOG.md i doc / uvod.md

Zavirujući u našu definiciju gradnje, vidjet ćemo da nam ona govori što graditi, ali ne i kako je graditi:

(defproject my-project "0.1.0-SNAPSHOT": description "FIXME: write description": url "//example.com/FIXME": licence {: name "EPL-2.0 ILI GPL-2.0-or-later With Classpath -exception-2.0 ": url" //www.eclipse.org/legal/epl-2.0/ "}: ovisnosti [[org.clojure / clojure" 1.9.0 "]]: glavni ^: preskoči-aot moj projekt .core: target-path "target /% s": profili {: uberjar {: aot: all}})

Ovo nam govori:

  • Pojedinosti o projektu koje se sastoje od naziva projekta, verzije, opisa, početne stranice i podataka o licenci.
  • Glavni prostor imena koji se koristi prilikom izvršavanja aplikacije
  • Popis ovisnosti
  • Ciljni put u koji se ugrađuje izlaz
  • Profil za izgradnju uberjara

Imajte na umu da je glavni izvorni prostor imena my-project.core, i nalazi se u datoteci moj_projekt / jezgra.clj. U Clojureu se ne preporučuje korištenje jednosegmentnih prostora imena - ekvivalent razredima najviše razine u Java projektu.

Uz to, imena datoteka generiraju se donjim crtama umjesto crticama, jer JVM ima problema s crticama u imenima datoteka.

Generirani kod je prilično jednostavan:

(ns my-project.core (: gen-class)) (defn -main "Ne radim puno ... još." [& args] (println "Zdravo, svijet!"))

Također, primijetite da je Clojure ovdje samo ovisnost. Zbog toga je trivijalno pisati projekte koristeći bilo koju verziju Clojure knjižnica koja se želi, a posebno da na istom sustavu radi više različitih verzija.

Ako promijenimo ovu ovisnost, tada ćemo dobiti alternativnu verziju.

4. Izgradnja i trčanje

Naš projekt ne vrijedi puno ako ga ne možemo izraditi, pokrenuti i spakirati za distribuciju, pa pogledajmo to dalje.

4.1. Pokretanje REPL-a

Nakon što imamo projekt, možemo pokrenuti REPL unutar njega pomoću lein repl. To će nam dati REPL koji ima sve u projektu već dostupno na putu predavanja - uključujući sve datoteke projekta kao i sve ovisnosti.

Također nas započinje u definiranom glavnom prostoru imena za naš projekt:

$ lein repl nREPL poslužitelj pokrenut na priključku 62856 na hostu 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-bitni poslužitelj VM 1.8.0_77-b03 Dokumenti: (doc ime-funkcije-ovdje) (pronađi-doc "dio-imena-ovdje") Izvor: (izvor funkcije-ime-ovdje) Javadoc: (javadoc java-objekt-ili- class-here) Izlaz: Control + D ili (exit) ili (quit) Rezultati: Pohranjeno u vars * 1, * 2, * 3, iznimka u * e my-project.core => (-main) Pozdrav, Svijet ! nula

Ovo izvršava funkciju -glavni u trenutnom prostoru imena, što smo vidjeli gore.

4.2. Pokretanje aplikacije

Ako radimo na aplikacijskom projektu - stvoren pomoću lein nova aplikacija - onda možemo jednostavno pokrenuti aplikaciju iz naredbenog retka. To se radi pomoću lein run:

$ lein run Zdravo, Svijete!

Ovo će izvršiti funkciju pozvanu -glavni u prostoru imena definiranom kao :glavni u našem projekt.clj datoteka.

4.3. Izgradnja knjižnice

Ako radimo na projektu knjižnice - stvoren pomoću lein novi zadani - onda knjižnicu možemo ugraditi u JAR datoteku za uključivanje u druge projekte.

To možemo postići na dva načina - koristeći se lein tegla ili lein instalirati. Razlika je jednostavno u tome gdje se nalazi izlazna JAR datoteka.

Ako koristimo lein tegla onda će ga smjestiti u lokalni cilj imenik:

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

Ako koristimo lein instalirati, zatim će izgraditi JAR datoteku, generirati pom.xml i smjestite ih u lokalno spremište Maven (obično ispod .m2 / spremište u početnom direktoriju korisnika)

$ lein install Created /Users/user/source/me/my-library/target/my-library-0.1.0-SNAPSHOT.jar Napisao /Users/user/source/me/my-library/pom.xml Instalirani jar i pom u lokalni repo.

4.4. Izgradnja Uberjara

Ako radimo na aplikacijskom projektu, Leiningen nam daje sposobnost da izgradimo ono što se naziva uberjar. Ovo je JAR datoteka koja sadrži sam projekt i sve ovisnosti te je postavljena tako da omogućuje njegovo pokretanje takvo kakvo jest.

$ lein uberjar Kompajliranje my-project.core Stvoreno /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

Datoteka my-project-0.1.0-SNAPSHOT.jar je JAR datoteka koja sadrži točno lokalni projekt i datoteku my-project-0.1.0-SNAPSHOT-standalone.jar sadrži sve potrebno za pokretanje aplikacije.

$ java -jar target / uberjar / my-project-0.1.0-SNAPSHOT-standalone.jar Pozdrav, Svijete!

5. Ovisnosti

Iako sami možemo napisati sve što je potrebno za naš projekt, općenito je znatno bolje ponovno koristiti posao koji su drugi već obavili u naše ime. To možemo učiniti tako da naš projekt ovisi o tim ostalim knjižnicama.

5.1. Dodavanje ovisnosti našem projektu

Da bismo našem projektu dodali ovisnosti, trebamo ih ispravno dodati u naš projekt.clj datoteka.

Ovisnosti su predstavljene kao vektor koji se sastoji od naziva i verzije dotične ovisnosti. Već smo vidjeli da se Clojure sam dodaje kao ovisnost, napisan u obliku [org.clojure / clojure “1.9.0”].

Ako želimo dodati druge ovisnosti, to možemo učiniti dodavanjem u vektor pored znaka : ovisnosti ključna riječ. Primjerice, ako želimo ovisiti o clj-json ažurirali bismo datoteku:

 : ovisnosti [[org.clojure / clojure "1.9.0"] [clj-json "0.5.3"]]

Jednom kad završimo, ako započnemo naš REPL - ili bilo koji drugi način za izgradnju ili pokretanje našeg projekta - tada će Leiningen osigurati da se ovisnosti preuzmu i budu dostupne na putu predavanja:

$ lein repl Dohvaćanje clj-json / clj-json / 0.5.3 / clj-json-0.5.3.pom iz klojara Dohvaćanje clj-json / clj-json / 0.5.3 / clj-json-0.5.3.jar iz clojars nREPL poslužitelj pokrenut na portu 62146 na hostu 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-bitni poslužitelj VM 1.8.0_77 -b03 Dokumenti: (doc ime-funkcije-ovdje) (find-doc "dio-imena-ovdje-ovdje") Izvor: (izvor funkcije-ime-ovdje) Javadoc: (javadoc java-objekt-ili-klasa-ovdje) Izlaz: Control + D ili (izlaz) ili (quit) Rezultati: Pohranjeno u vars * 1, * 2, * 3, iznimka u * e my-project.core => (require '(clj-json [core: as json])) nil my-project.core => (json / generiraj-niz {"foo" "bar"}) "{\" foo \ ": \" bar \ "}" my-project.core =>

Također ih možemo koristiti iz našeg projekta. Na primjer, mogli bismo ažurirati generirano src / my_project / core.clj datoteka na sljedeći način:

(ns my-project.core (: gen-class)) (require '(clj-json [jezgra: kao json]))) (defn -main "Ne radim puno ... još." [& args] (println (json / generiraj-string {"foo" "bar"}))))

A onda će pokretanje učiniti točno onako kako se očekivalo:

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

5.2. Pronalaženje ovisnosti

Često može biti teško pronaći ovisnosti koje želimo koristiti u našem projektu. Leiningen dolazi s ugrađenom funkcionalnošću pretraživanja kako bi ovo bilo lakše. To se radi pomoću lein pretraga.

Na primjer, možemo pronaći naše JSON knjižnice:

$ lein search json Pretraživanje u središtu ... [com.jwebmp / ​​json "0.63.0.60"] [com.ufoscout.coreutils / json "3.7.4"] [com.github.iarellano / json "20190129"] ... .. Pretraživanje klojara ... [cheshire "5.8.1"] JSON i JSON SMILE kodiranje, brzo. [json-html "0.4.4"] Navedite JSON i nabavite DOM čvor s ljudskom predstavom tog JSON-a [ring / ring-json "0.5.0-beta1"] Prsten međuprogrami za rukovanje JSON-om [clj-json "0.5. 3 "] Brzo JSON kodiranje i dekodiranje za Clojure putem Jackson knjižnice. .....

Ovo pretražuje sva spremišta s kojima naš projekt radi - u ovom slučaju Maven Central i Clojars. Zatim vraća točan niz koji treba staviti u naš projekt.clj datoteku i, ako je dostupno, opis knjižnice.

6. Testiranje našeg projekta

Clojure ima ugrađenu podršku za jedinstveno testiranje naše aplikacije, a Leiningen to može iskoristiti za naše projekte.

Naš generirani projekt sadrži testni kôd u test direktorij, uz izvorni kod u src imenik. Uključuje i jedan neuspjeli test prema zadanim postavkama - pronađen u test / my_project / core-test.clj:

(ns my-project.core-test (: zahtijeva [clojure.test: refer: all] [my-project.core: refer: all])) (deftest a-test (testiranje "FIXME, I fail." (je (= 0 1))))

Ovo uvozi my-project.core prostor imena iz našeg projekta i clojure.test prostor imena iz jezgre jezika Clojure. Zatim definiramo test s odmrznuti i testiranje poziva.

Odmah možemo vidjeti imena testa i činjenica da je namjerno napisan da ne uspije - to potvrđuje 0 == 1.

Pokrenimo ovo pomoću lein test naredba, i odmah vidjeti testove kako rade i ne uspijevaju:

$ lein test lein test my-project.core-test lein test: samo my-project.core-test / a-test FAIL in (a-test) (core_test.clj: 7) FIXME, ne uspijevam. očekivano: (= 0 1) stvarno: (ne (= 0 1)) Izvršeno 1 ispitivanje koje sadrži 1 tvrdnju. 1 kvara, 0 pogrešaka. Testovi nisu uspjeli.

Ako umjesto toga popravimo test, mijenjajući ga kako bismo to potvrdili 1 == 1 umjesto toga, tada ćemo umjesto toga dobiti prolaznu poruku:

$ lein test lein test my-project.core-test Ran 1 testovi koji sadrže 1 tvrdnju. 0 neuspjeha, 0 pogrešaka.

Ovo je puno sažetiji rezultat, koji pokazuje samo ono što moramo znati. Ovo znači to kad ima kvarova, oni se odmah ističu.

Ako želimo, možemo pokrenuti i određeni podskup testova. Naredbeni redak omogućuje pružanje prostora imena i izvršavaju se samo testovi u tom prostoru imena:

$ lein test my-project.core-test lein test my-project.core-test Ran 1 testovi koji sadrže 1 tvrdnju. 0 neuspjeha, 0 pogrešaka. $ lein test my-project.unknown lein test my-project.unknown Ran 0 testova koji sadrže 0 tvrdnji. 0 neuspjeha, 0 pogrešaka.

7. Sažetak

Ovaj je članak pokazao kako započeti s Leiningen alatom za izgradnju i kako ga koristiti za upravljanje našim projektima temeljenim na Clojureu - i izvršnim aplikacijama i zajedničkim knjižnicama.

Zašto ga ne isprobati na sljedećem projektu i vidjeti koliko dobro može funkcionirati.


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