Scala または Play アプリケーションのためのリモート sbt コンソールの実行
最終更新日 2023年11月29日(水)
Table of Contents
デプロイ先と同じ環境で sbt コンソールを実行することは、本番環境のエラーをデバッグするための重要な手段です。この記事では、リモートコンソールを起動する 2 つの方法について説明します。
Scala または Play アプリケーションが Heroku 上ですでに実行され、正しく動作していることが前提です。まだの場合は、スターターガイドに従ってすばやく作成できます。アプリケーションを準備して実行したら、最初のコンソールの手法を試す準備はできています。
デフォルトの sbt コンソールの実行
HerokuCLI の run
コマンドを次のように使用すると、追加のコードなしで sbt をリモートで実行できます。
$ heroku run sbt console
...
Running `sbt console` attached to terminal... up, run.3991
Picked up JAVA_TOOL_OPTIONS: -Djava.rmi.server.useCodebaseOnly=true
Getting org.scala-sbt sbt 0.13.5 ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt/0.13.5/jars/sbt.jar ...
[SUCCESSFUL ] org.scala-sbt#sbt;0.13.5!sbt.jar (94ms)
...
>
ただし、run
コマンドによって作成された One-off dyno では、sbt キャッシュにアクセスできないため、アプリケーションのすべての依存関係を再度ダウンロードする必要があります。これは、設定に少し変更を加えることで回避できます。
カスタムメインクラスでの起動
すべての Play 2.2.x および 2.3.x アプリケーションにデフォルトで含まれている sbt-native-packager を使用すると、カスタムメインクラスでアプリケーションを起動できます。まず、project/plugins.sbt
ファイルに次の行を追加して、アプリケーションでバージョン 0.7.6 以降の sbt-native-packager を使用していることを確認します (Play 2.1.x および 2.0.x アプリケーションにデフォルトで含まれている sbt-start-script
プラグインをすでに使用している場合、これによって競合が発生することに注意してください)。
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.7.6")
その後、次の行を build.sbt
に追加して、Scala コンパイラを依存関係として追加します。
libraryDependencies <+= scalaVersion("org.scala-lang" % "scala-compiler" % _ )
ここで、次のコマンドを実行して、アプリケーションをコンパイルおよびステージングします。
$ sbt compile stage
sbt プロセスが完了した後、次のコマンドを実行し、"<your-app>“ を build.sbt
の name
設定の値に置き換えることによって、ローカルコンソールを起動できます。
$ target/universal/stage/bin/<your-app> -main scala.tools.nsc.MainGenericRunner -usejavacp
Failed to created JLineReader: java.lang.NoClassDefFoundError: jline/console/completer/Completer
Falling back to SimpleReader.
Welcome to Scala version 2.11.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_51).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val i = 7
i: Int = 7
scala> i*i
res0: Int = 49
scala>
Ctrl+C
を押して終了します。
ここで、そのコマンドを Procfile
に配置して、リモートで実行できるようにします。アプリにまだ Procfile
がない場合、ルートディレクトリに作成します。その後、次のコードをこのファイルに追加します (両方の行で ”<your-app>“ を置き換えます)。
web: target/universal/stage/bin/<your-app> -Dhttp.port=${PORT}
console: target/universal/stage/bin/<your-app> -main scala.tools.nsc.MainGenericRunner -usejavacp
次のようにして、すべての変更をコミットして Heroku にプッシュします。
$ git add build.sbt project/plugins.sbt Procfile
$ git commit -m "added custom main class runner"
$ git push heroku master
デプロイが完了した後、次のように Procfile から console
ターゲットを実行することで Scala コンソールを起動できます。
$ heroku run console
Running `console` attached to terminal... up, run.2581
Picked up JAVA_TOOL_OPTIONS: -Djava.rmi.server.useCodebaseOnly=true
Failed to created JLineReader: java.lang.NoClassDefFoundError: jline/console/completer/Completer
Falling back to SimpleReader.
Welcome to Scala version 2.11.1 (OpenJDK 64-Bit Server VM, Java 1.8.0_20-slim).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
Ctrl+C
を押して再び終了します。
Scala コンソールの使用方法についての詳細は、Scala REPL のドキュメントを参照してください。sbt-native-packager プラグインを使用してカスタムメインクラスを実行する方法についての詳細は、sbt ドキュメントサイトを参照してください。