Scala は JVM バイトコードにコンパイルされます。ビルド時には Scala コンパイラーが必要であり、
アプリケーションの実行時クラスパスには Scala 標準ライブラリが必要です。
Scala のバイナリーバージョンは互換性の境界です。末尾が _2.13 のアーティファクトを
_3 のアーティファクトで置き換えることはできません。
バージョンとツールチェーン #
Scala 2 と Scala 3 にはそれぞれ異なるコンパイラーと言語規則があります。クロス公開されたライブラリには、 プロジェクトが選択したバイナリーバージョンを使用します。Java ランタイムは Scala リリースに記載された JDK 要件を満たす必要があり、 デプロイで使う JDK でコンパイルとテストを実行します。
For a small program:
scala-cli run Main.scala
scala-cli test .Scala CLI はソース中心のプロジェクトでコンパイラーと依存関係の解決を管理します。 保守対象のアプリケーションでは、開発者のローカルなコマンド履歴に依存せず、ビルド定義をコミットしてください。
sbt #
sbt は Scala のビルドツールです。ランチャーは JVM 上で起動し、プロジェクトが宣言した sbt バージョンをダウンロードします。
project/build.properties で sbt のバージョンを固定し、Scala バージョンを一度だけ定義します。
ThisBuild / scalaVersion := "3.5.2"
ThisBuild / organization := "com.example"
lazy val root = (project in file("."))
.settings(
name := "orders",
libraryDependencies += "org.typelevel" %% "cats-core" % "2.12.0"
)プロジェクトルートから sbt test、sbt compile、sbt package を実行します。
%% 演算子は、現在の Scala バイナリーバージョンに一致するアーティファクト接尾辞を選択します。
sbt 自体はプロジェクトとは異なる Scala バージョンで実行できます。ランチャーは sbt 内部が必要とするバージョンを使います。
Coursier #
Coursier は JVM アーティファクトを解決し、Scala ツールをインストールします。 Maven 座標でアプリケーションを起動し、依存関係をキャッシュし、名前付きコマンドをインストールできます。
cs launch scala:3.5.2 -- -version
cs install scala-cli自動化ではアプリケーションの座標とバージョンを明示します。Coursier のキャッシュが再現性を高めるのは、 座標とリポジトリを管理している場合だけです。依存関係のロックやアーティファクトの検証に取って代わるものではありません。
座標、リポジトリ、チャネル #
Coursier は Maven の座標モデルを再利用し、Scala 固有のアーティファクト向けに拡張します。
- Java アプリケーションには
group:app:version。 - Scala アーティファクトには
group::app:version。 - Scala のクロスバージョンアーティファクトには
group:::app:version。
設定済みのリポジトリから依存関係を解決し、アーティファクトをローカルキャッシュにダウンロードします。 リポジトリはコマンドライン、ローカルディレクトリ、チャネル記述子ソースから指定できます。
チャネルはアプリケーション記述子 JSON ファイルの集合です。チャネルは HTTP で提供したり、 ローカルディレクトリを基盤にしたり、JAR ファイルにパッケージ化したりできます。 そのため Coursier は手書きのビルド定義なしでインストール可能なアプリを発見できます。
ランチャーとパッケージング #
Coursier がインストールするのは単なるソースツリーではなく、実行可能なランチャーです。
インストールされたコマンドは通常、スクリプトが先頭に付いた JAR、つまり小さなランチャースクリプトの後に JAR バイト列が続く形式です。
シェルラッパーは -J オプションを JVM に渡し、埋め込まれたアプリケーションのメインクラスを実行します。
cs install scala-cli
cs launch scala:3.5.2 -- -versionこのパッケージングにより、JAR 形式を java -jar 用に保ったまま、ユーザーは ./tool を直接実行できます。
実際のトレードオフとして、ランチャーはキャッシュされたアーティファクトと選択したリポジトリ集合に依存します。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)