Scala の学習用に Ammonite 環境 を AWS EC2 上に構築していて、Scala Exercises の例を試せるように紹介されている cats や shapeless のライブラリを追加していた。ただ、個人的に Ruby を使う機会が圧倒的に多いので pry は必須だし、Go もやってみたいと考えているうちに、「REPL 環境をまとめた Docker コンテナを作成してしまえば楽なのでは?」と思って Rod (REPLs on Docker) というツールを作成した。
Github と Dockerhub を連携させて Automated Build 設定しているので、Github が更新されると自動的に Dockerhub 内部で docker build と docker push してくれる。
https://hub.docker.com/r/kyagi/rod/
簡単な使い方は以下の通り。例えば Scala Exercises の Cats | Semigroup の紹介されているコード例をそのまま打ち込めば試せるようになっている。自分自身が sbt console の使い勝手にあまり満足していないのと、Scala の開発環境構築に手間取ったところがあるので、こういったツールが誰かの役に立ってくれれば嬉しい。(^.^)
docker コンテナをたちあげる。
$ docker run -it kyagi/rod ____ _____ ____ _ ____ _ | _ \| ____| _ \| | ___ ___ _ __ | _ \ ___ ___| | _____ _ __ | |_) | _| | |_) | | / __| / _ \| '_ \ | | | |/ _ \ / __| |/ / _ \ '__| | _ <| |___| __/| |___\__ \ | (_) | | | | | |_| | (_) | (__| < __/ | |_| \_\_____|_| |_____|___/ \___/|_| |_| |____/ \___/ \___|_|\_\___|_| root@e8dcf015f1b5:~#
Scala の REPL を使いたい時は rod scala で amm が起動する。
root@e8dcf015f1b5:~# rod scala
Loading...
Compiling (synthetic)/ammonite/predef/interpBridge.sc
Compiling (synthetic)/ammonite/predef/replBridge.sc
Compiling (synthetic)/ammonite/predef/DefaultPredef.sc
Compiling /root/.ammonite/predef.sc
Welcome to the Ammonite Repl 1.0.3
(Scala 2.12.4 Java 1.8.0_151)
If you like Ammonite, please support our development at www.patreon.com/lihaoyi
@ import cats.Semigroup
import cats.Semigroup
@ import cats.implicits._
import cats.implicits._
@ Semigroup[Int => Int].combine({ (x: Int) => x + 1 }, { (x: Int) => x * 10 }).apply(6)
res2: Int = 67
@ exit
Bye!
root@e8dcf015f1b5:~#
Ruby の場合は pry が立ち上げる。
root@e8dcf015f1b5:~# rod ruby [1] pry(main)> ri open (... snip ...) いっぱいあるけど Tempfile.open が知りたい [2] pry(main)> ri Tempfile.open (... snip ...) [3] pry(main)> ri Array (... snip ...) Array クラスのドキュメント [4] pry(main)> ri Array# (... snip ...) Array クラスのインスタンスメソッド一覧
Go の場合は gore が立ち上げる。
root@e8dcf015f1b5:~# rod go
gore version 0.2.6 :help for help
gore> :help
:import <package> import a package
:print print current source
:write [<file>] write out current source
:doc <expr or pkg> show documentation
:help show this help
:quit quit the session
gore> :quit
root@e8dcf015f1b5:~#
いろいろいれたらイメージサイズがふくらんでしまった(1.43GB)。特定の言語の REPL があればいい場合は、Dockerfile を削ることで軽量化できるけど、その逆にこの REPL も入れたい(例えば gore じゃなくて go-pry を使いたいなど) とかもあるかもしれない。
ちなみに .rod-prompt を読み込むことでプロンプトが変わって、Docker コンテナ内の環境にいることがわかりやすくなる(おまけ)。(๑˃̵ᴗ˂̵)و