Hello Scala
環境構築
mise をactivate
eval "$(~/.local/bin/mise activate zsh)"
し
- Java
- Scala
- SBT
を導入
mise use java
# mise ~/dev/playground/.mise.toml tools: java@23.0.1
mise use scala
# mise ~/dev/playground/.mise.toml tools: scala@3.5.1
mise use sbt
# mise ~/dev/playground/.mise.toml tools: sbt@1.10.3
Nix
使わなかった。VSCodeを使用するために必要な手順が多かったので。
Metals を使うためにNix Environment Selector への依存を定義する必要がある。ここにextensionDependenciesを用いた回避策がある。しかしVS Code拡張をDerivationsとして管理することを前提としている。この回避策は採用しない。
Metalsがどうも動作しなかった
no build target found for /home/vega/dev/playground/src/main/scala/example/Main.scala. Using presentation compiler with project's scala-library version: 3.3.4
のでjetbrains.idea-communityを使用する。
SBT New によりprojectを生成する
sbt new
選択肢が現れる。名前から受ける印象で単純さの順に
- scala/scala3.g8: Scala 3 seed template
- scala/toolkit.local: Scala Toolkit (beta) by Scala Center and VirtusLab
- sbt/cross-platform.local: A cross-JVM/JS/Native project
他にも typelevel/toolkit.local 等のテンプレートが並ぶ
WIP: Giter8
.g8
で終わるテンプレート
.local
は異なる動作をする。
build.sbtをそれぞれ見ていく。
scala3.g8
lazy val root = project
.in(file("."))
.settings(
name := "hello",
version := "0.1.0-SNAPSHOT",
scalaVersion := scala3Version,
libraryDependencies += "org.scalameta" %% "munit" % "1.0.0" % Test
)
プロジェクトごとに指定する。
libraryDependencies: https://www.scala-sbt.org/1.x/docs/ja/Library-Dependencies.html#キー
toolkit.local
val toolkitV = "0.5.0"
val toolkit = "org.scala-lang" %% "toolkit" % toolkitV
ThisBuild / scalaVersion := "3.3.4"
libraryDependencies += toolkit
前述のテンプレートより単純化されている。以下の
lazy val root = project
.in(file("."))
.settings(...)
がない。ビルド全体で統一して指定している。
sbt tasksでタスクを一覧できた。fgRunによりエントリポイントを実行できる。
- IntelliJ経由でsbtを操作
- sbtのドキュメントを読む
- ライブラリの定義箇所を読む。これはあまり深追いしない。
IDEが難しい
- invalidate caches
824.7 MBのimageができた
jlinkOptions += "--compress=zip-6"
を指定して891.52 MB
native buildするには
build.sbt
.settings(
nativeConfig ~= { c =>
c.withLinkingOptions(Seq("-static"))
.withOptimize(true)
.withLTO(LTO.thin)
.withMode(Mode.releaseFull)
},
https://scala-native.org/en/stable/user/sbt.html#minimal-sbt-project gitter8 templateなど
LLVM依存が有る
sbt nativeLinkReleaseFull
# or sbt nativeLinkReleaseFast
❯ ls -l example.Hello
.rwxr-xr-x 1.7M vega 18 11月 02:05 example.Hello
target/scala-3.6.1/native on main [!⇡]
❯ readelf -h example.Hello
ELF Header:
Magic: 7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - GNU
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x401d00
Start of program headers: 64 (bytes into file)
Start of section headers: 1654112 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 11
Size of section headers: 64 (bytes)
Number of section headers: 27
Section header string table index: 26