Open15

Hello Scala

SonoSono

環境構築

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として管理することを前提としている。この回避策は採用しない。

SonoSono

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を使用する。

SonoSono

SBT New によりprojectを生成する

sbt new

選択肢が現れる。名前から受ける印象で単純さの順に

  1. scala/scala3.g8: Scala 3 seed template
  2. scala/toolkit.local: Scala Toolkit (beta) by Scala Center and VirtusLab
  3. sbt/cross-platform.local: A cross-JVM/JS/Native project

他にも typelevel/toolkit.local 等のテンプレートが並ぶ

WIP: Giter8

.g8で終わるテンプレート
https://www.foundweekends.org/giter8/

.local は異なる動作をする。

SonoSono

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(...)

がない。ビルド全体で統一して指定している。

ThisBuild: https://www.scala-sbt.org/1.x/docs/ja/sbt-by-example.html#sbt+シェルから+ThisBuild+%2F+scalaVersion+をセットする

SonoSono

sbt tasksでタスクを一覧できた。fgRunによりエントリポイントを実行できる。

SonoSono
  • IntelliJ経由でsbtを操作
  • sbtのドキュメントを読む
  • ライブラリの定義箇所を読む。これはあまり深追いしない。

IDEが難しい

  • invalidate caches
SonoSono

824.7 MBのimageができた
https://www.scala-sbt.org/1.x/docs/sbt-by-example.html#Dockerize+your+app

jlinkOptions += "--compress=zip-6"を指定して891.52 MB

SonoSono

📝

  .settings(
    dockerBaseImage := "eclipse-temurin:23-jre-alpine",
    jlinkOptions += "--compress=zip-8",
    jlinkIgnoreMissingDependency := JlinkIgnore.everything,
SonoSono
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