🤖

swiftのLinux用開発環境構築

2022/03/24に公開

swiftのLinux用開発環境を構築方法について共有します。エディタはVSCodeでリモートコンテナで開発します。エディタの設定はdevcontainer.jsonに全て書かれています。

.devcontainer/devcontainer.json
{
	"name": "Docker from Docker Compose",
	"dockerComposeFile": "../docker-compose.yml",
	"service": "app",
	"workspaceFolder": "/home/user/scan-swift",
	"settings": {
		"terminal.integrated.defaultProfile.linux": "bash",
		"[swift]": {
			"editor.formatOnSave": true
		},
		"sourcekit-lsp.serverPath": "/usr/bin/sourcekit-lsp",
		"apple-swift-format.path": "/usr/bin/swift-format"
	},
	"extensions": [
        "vknabel.vscode-apple-swift-format",
        "sswg.swift-lang"
	],
	"remoteUser": "user"
}

Dockerfileは次のとおりです。

Dockerfile
FROM swift:5.6.0-focal
WORKDIR /build
COPY Tools Tools
COPY build_tools.sh .
RUN bash build_tools.sh
RUN install Tools/.build/release/swift-format /usr/bin
RUN rm -rf /build
ARG USERNAME=user
ARG GROUPNAME=user
ARG UID=1000
ARG GID=1000
ARG PASSWORD=user
RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID -G sudo $USERNAME && \
    echo $USERNAME:$PASSWORD | chpasswd && \
    echo "$USERNAME   ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER $USERNAME
WORKDIR /home/$USERNAME/scan-swift

Toolsswift-formatをビルドしている以外はswift:5.6.0-focalをそのまま使っている感じです。Toolsの中身については、githubにあげたリポジトリを参照してください。
https://github.com/nnabeyang/scan-swift
VSCodeを使用している限りは基本的に保存するたびフォーマットされますが、一度に全ファイルについてフォーマットする場合は次のスクリプトでフォーマットできます。

format.sh
#!/usr/bin/env bash
if type "swift-format" > /dev/null 2>&1; then
    swift-format -p --recursive ./Sources ./Tests --in-place
else
    swift run --skip-build -c release --package-path Tools swift-format -p --recursive ./Sources ./Tests --in-place
fi

Xcode 13.3を使用している限りはDocker無しの状態で利用できます。その時はsourcekit-lsp.serverPathapple-swift-format.pathの設定を環境に合わせて変更してください。

今のところ1度コンパイルしないと型が見つけられなかったり、テストケースが見つけられないようです。それ以外は概ね問題なく動いているように感じます。まだVSCodeの拡張機能がプレビュー版なので、今後改善していくと期待しています。
https://marketplace.visualstudio.com/items?itemName=sswg.swift-lang

Discussion