29 maja 2013

giter8 i sbt - pierwsze kroki przy tworzeniu projektów ze Scalą

Zawsze zastanawiało mnie, jak rozpocząć pracę z językiem Scala z linii poleceń. Potrzebowałem mechanizmu, który utworzyłby mi katalog na potrzeby projektu w Scali, z odpowiednio ułożonymi podkatalogami na kody źródłowe samej aplikacji oraz jej testów.

giter8 - narzędzie tworzenia plików i katalogów na podstawie szablonów w GitHub

Był czas, kiedy żyłem w błogiej niewiedzy istnienia Scala Build Tools (sbt). Potrzebowałem narzędzia do zarządzania projektem - budowania go z pobraniem zależnych bibliotek, kompilacją, wykonaniem testów, itp. To właśnie zadanie dla sbt.

Wszystkie znaki na niebie i ziemi mówiły mi, że ostatnią rzeczą, jaką robi sbt, to utworzenie nowego projektu z właściwą strukturą katalogową. Okazało się, że sbt jest na tyle "wyrafinowane", że potrafi pracować z każdą strukturą katalogów, co w zasadzie powinno mnie cieszyć, ale przy mojej niewiedzy, tylko komplikowało sprawę. Skąd miałbym wiedzieć, jak rozłożyć pliki źródłowe aplikacji, aby było dobrze, jeśli...wszystko może być dobrze (czy właśnie nie odpowiedziałem sobie na to pytanie?)

To zapewne był powód odpalenia projektu giter8 (w skrócie g8). Już nie pamiętam, kto mi go wskazał, ale to miało być rozwiązaniem moich bolączek. I faktycznie było.

"Giter8 is a command line tool to generate files and directories from templates published on github or any other git repository. It's implemented in Scala and runs through the Simple Build Tool launcher, but it can produce output for any purpose."

Instalacja opisana jest na stronie Installation. Jej zakończenie obwieszcza uruchomienie g8.
$ g8

giter8 0.5.3
Usage: g8 [TEMPLATE] [OPTION]...
Apply specified template.

OPTIONS
    -b, --branch
        Resolves a template within a given branch
    --paramname=paramvalue
        Set given parameter value and bypass interaction.


Apply template and interactively fulfill parameters.
    g8 n8han/giter8

Or
    g8 git://github.com/n8han/giter8.git

Apply template from a remote branch
    g8 n8han/giter8 -b some-branch

Apply template from a local repo
    g8 file://path/to/the/repo

Apply given name parameter and use defaults for all others.
    g8 n8han/giter8 --name=template-test

g8 typesafehub/scala-sbt - Scala sbt template

I co teraz?

W Usage do g8, napisano: "Template repositories must reside on github and be named with the suffix .g8. We're keeping a list of templates on the wiki." I to cieszy, że komuś zależy i zebrał pomocne szablony w jednym miejscu!

Właśnie dzisiaj trafiłem na projekt Scala sbt template, który jest "A giter8 template for Scala projects using sbt."

Skoro należy do repozytorium projektów Typesafe Inc., to można założyć, że jest projektem błogosławionym przez samych twórców Scali (niekoniecznie gwarancja jakości, ale chociaż aktualności). Coś mi jednak mówi, że ostatnia zmiana "authored a year ago" nie jest specjalnie obiecująca w kontekście aktualności projektu. Ale co robić?

Odpalam g8 typesafehub/scala-sbt i korzystam wstępnie z projektu.
$ g8 typesafehub/scala-sbt

Scala Project Using sbt

organization [org.example]: pl.japila
name [Scala Project]:
scala_version [2.9.2]: 2.10.1
version [0.1-SNAPSHOT]:

Template applied in ./scala-project

jacek:~/sandbox
$ cd scala-project/
jacek:~/sandbox/scala-project
$ tree
.
├── README
├── project
│   └── ScalaProjectBuild.scala
└── src
    └── main
        └── scala
            └── pl
                └── japila
                    └── ScalaProject.scala

6 directories, 3 files
$ cat README
A sample for the Typesafe Stack (http://typesafe.com/stack).

Scala sample project using Scala and SBT.

To run and test it use SBT invoke: 'sbt run'

jacek:~/sandbox/scala-project
$ sbt run
[info] Loading project definition from /Users/jacek/sandbox/scala-project/project
[info] Updating {file:/Users/jacek/sandbox/scala-project/project/}default-9e49ab...
[info] Resolving org.scala-sbt#precompiled-2_10_0;0.12.2 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/jacek/sandbox/scala-project/project/target/scala-2.9.2/sbt-0.12/classes...
[info] Set current project to Scala Project (in build file:/Users/jacek/sandbox/scala-project/)
[info] Updating {file:/Users/jacek/sandbox/scala-project/}scala-project...
[info] Resolving org.scala-lang#scala-library;2.10.1 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/jacek/sandbox/scala-project/target/scala-2.10/classes...
[info] Running pl.japila.ScalaProject
Hello, Scala Project
[success] Total time: 13 s, completed May 29, 2013 10:08:54 PM
"Hello, Scala Project" oraz "success" na końcu dają mi pewne poczucie spełnienia moich oczekiwań. Mam swój pierwszy projekt w Scali z udziałem g8!

g8 kobmic/plain-scala

Jeszcze na koniec swojej wyprawy w świat uruchomienia projektów scalowych z g8 przeszukałem sieć i trafiłem na kobmic/plain-scala. Wydaje się być świeższą i bardziej kompletną alternatywą do szablonu z Typesafe.

Projekt scala-project idzie do kosza i odpalam g8 kobmic/plain-scala.
jacek:~/sandbox
$ g8 kobmic/plain-scala

Plain Scala project with scalatest and/or specs2

version [0.1.0-SNAPSHOT]:
organization [my.organization]: pl.japila
name [MyScalaProject]:

Template applied in ./myscalaproject
I już widzę miejsce do poprawy w szablonie - nazwa tworzonego projektu jest bez (ostatnio ulubionych) myślników.

Kontynuuję prace...
jacek:~/sandbox
$ cd myscalaproject
jacek:~/sandbox/myscalaproject
$ tree
.
├── build.sbt
├── project
│   └── plugins.sbt
└── src
    ├── main
    │   └── scala
    │       └── Stub.scala
    └── test
        └── scala
            ├── StubSpec.scala
            └── StubTest.scala

6 directories, 5 files
Tym razem stawiam na pisanie testów do mojego wymyśl(o)nego projektu w Scali. Stąd też powód uruchomienia sbt test.

// pół pobranego Internetu później...
jacek:~/sandbox/myscalaproject
$ sbt test
[info] Loading project definition from /Users/jacek/sandbox/myscalaproject/project
[info] Set current project to MyScalaProject (in build file:/Users/jacek/sandbox/myscalaproject/)
[info] StubTest:
[info] you description here
[info] - should do something
[info] StubSpec
[info]
[info] The 'Hello world' string should
[info] + contain 11 characters
[info] + start with 'Hello'
[info] + end with 'world'
[info]
[info]
[info] Total for specification StubSpec
[info] Finished in 27 ms
[info] 3 examples, 0 failure, 0 error
[info]
[info] Passed: : Total 4, Failed 0, Errors 0, Passed 4, Skipped 0
[success] Total time: 4 s, completed May 29, 2013 10:57:20 PM
W Usage projektu można przeczytać, że odpalenie sbt eclipse lub sbt gen-idea pozwala na łatwiejsze wczytanie projektu do ulubionego IDE. Wybieram IntelliJ IDEA.