🏝️

devcontainer で Kotlin 入門

2022/12/31に公開

初めての Zenn での投稿で、2022年最初で最後のブログです。
お正月休みの課題として今までちゃんと触ったことがなかった Kotlin に入門することにしました。
ローカル環境に色々と入れたくなかったので devcontainer を使ったのですが、まとまった日本語の記事がなかったのでブログを書きました。
※ちなみに記事は Obisidian を使ってまとめました

事前準備

この記事は VSCode・Dev Containers Extension がインストール済みであることを想定しています。

$ mkdir demo && cd demo

適当なフォルダを作成して Kotlin Project を作成します。

Kotlin Dev Container

.devcontainer/devcontainer.json を作成して下記を記述。
VSCode がデフォルトで用意している Java 用の devcontainer に Kotlin Compiler の kotlinc を追加して Gradle を使うように設定しています。

.devcontainer/devcontainer.json
// For format details, see <https://aka.ms/devcontainer.json>. For config options, see the
// README at: <https://github.com/devcontainers/templates/tree/main/src/java>
{
    "name": "Java",
    "image": "mcr.microsoft.com/devcontainers/java:0-17-bullseye",
    "features": {
        "ghcr.io/devcontainers/features/java:1": {
            "version": "none",
            "installMaven": "false",
            "installGradle": "true"
        },
        "ghcr.io/mikaello/devcontainer-features/kotlinc:1": {}
    },
    "extensions": [
        "mathiasfrohlich.kotlin",
        "vscjava.vscode-java-pack"
    ],
    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    // "forwardPorts": [],
    // Use 'postCreateCommand' to run commands after the container is created.
    // "postCreateCommand": "java -version",
    "postStartCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
    "customizations": {
        "vscode": {
            "extensions": [
                "fwcd.kotlin",
                "vscjava.vscode-java-pack",
                "vscjava.vscode-gradle"
            ]
        }
    }
    // Configure tool-specific properties.
    // "customizations": {},
    // Uncomment to connect as root instead. More info: <https://aka.ms/dev-containers-non-root>.
    // "remoteUser": "root"
}

記述できたらコマンドパレットで Reopen in Container を入力して暫く待つ

Gradle で Kotlin Project の作成

VSCode のターミナルをアクティブにして下記コマンドで Kotlin の Gradle プロジェクトを作成。

gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 4

Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Kotlin) [1..2] 2

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] 
Project name (default: test-kotlin-project): 
Source package (default: test.kotlin.project): 

> Task :init
Get more help with your project: https://docs.gradle.org/7.6/samples/sample_building_kotlin_applications.html

BUILD SUCCESSFUL in 10m 17s
2 actionable tasks: 2 executed

プロジェクトが作成されると以下のような構成になっている。

.
├── app
│   ├── build.gradle.kts
│   └── src
│       ├── main
│       │   ├── kotlin
│       │   │   └── demo
│       │   │       └── App.kt
│       │   └── resources
│       └── test
│           ├── kotlin
│           │   └── demo
│           │       └── AppTest.kt
│           └── resources
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts

12 directories, 9 files

参考ページ
https://docs.gradle.org/current/samples/sample_building_kotlin_applications.html

Makefile でコマンド管理

ビルドやテストは VSCode の tasks を使ってもいいんですが、慣れている Makefile で用意。

Makefile
.PHONY: build
build:
	./gradlew build -x test

run:
	./gradlew run

.PHONY: test
test:
	./gradlew test

run でアプリケーションが実行されることを確認。

$ make run
./gradlew run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 781ms
2 actionable tasks: 1 executed, 1 up-to-date

このプロジェクトのリポジトリ
https://github.com/yusei-wy/kotlin-demo

まとめ

短い記事になりましたが、以上になります。
個人的な目標で2023年はアウトプットを増やしていきたいと思っています。
この流れで Kotlin で C コンパイラを作る予定なので、また記事にできればと思います。

Discussion