Windows で Swift公式Docker イメージをVSCodeから使う“やさしい”手順


https://qiita.com/nak435/items/0180c390db39a84a8212

↑前回の記事で取得した Swift公式Dockerイメージを、VSCode から使う方法を“図解付き”でまとめます。
（Windows 以外の OS でも、ここで説明する手順は同じです）

前回の記事の続きのため、以下の環境がインストール済みであることを前提とします。

- Visual Studio Code
- WSL（Ubuntu）
- Docker Desktop for Windows
- Swift Docker Image

また、Docker Desktop for Windows を起動し、Docker Engine Running 状態にしておくこと。
![engine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/9c4db833-b8a1-2d7c-c9bf-ec3997fc9fba.png)

# 1. VSCodeに拡張機能をインストール

Dockerコンテナを作成する準備として、（ローカルの）VSCodeに次の3つの拡張機能をインストールします。（検索して「インストール」を押す。）
すでにインストール済みなら手順1.1へスキップ。

- Docker

![ex_docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/4e7f0a46-0470-e6d9-f57d-856df591fd23.png)

- Dev Containers

![ex_dev-container.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ce9e391e-e145-1e38-3d5d-f44f64558697.png)

- Swift 

![ex_swift.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/40eaddbf-0531-3b43-430d-efbf694c12e5.png)

## 1.1 インストールした拡張機能を確認

上記の拡張機能をインストールすると、↓このようになるはずです。

_CodeLLDB は、Swift拡張機能と一緒にインストールされます。_


<img width="300" alt="ext 2024-06-25 152604.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/3d52b4ca-16da-6ff6-b7c2-54dcaf424e5d.png" />

本題では不要ですが、「推奨」の先頭に出ている WSL が、VSCodeを開く度に「推奨」されます。ここでインストールしておく方が 今後うるさくなくてよいかも。
 

# 2. Swiftプロジェクトのルートフォルダを作成

Windowsターミナル（一般ユーザのPowerShell）を起動し、適当なディレクトリで以下のコマンドを実行します。

```terminal
> mkdir swift #プロジェクトのルートフォルダを作成
> cd swift #プロジェクトフォルダに移動
> code . #VSCodeでプロジェクトフォルダを開く
```

↓ここでは、`C:\Users\nak435\Documents\myDocker_tpl`ディレクトリとして進める。

![term.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/f2f0a727-c42c-0ea9-88e6-5db3f1fef478.png)

# 3. Dockerコンテナの作成

順を追って説明します。

## 3.1 Dockerfileの作成

「新しいファイル...」をクリックする

![scr 2024-06-25 155132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b660c511-46ba-6163-1d56-a321404d0ef8.png)

ファイル名を「Dockerfile」とする

![scr 2024-06-25 155206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b731b110-3588-a3f0-d462-db771d98f558.png)

ファイルの中身は 次の2行として、必ず「保存」する

```text:Dockerfile
FROM swift:latest
RUN /bin/bash
```

## 3.2 コンテナーの作成

![scr 2024-06-25 155408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/2adf9853-f799-badd-2964-1a0e933fb001.png)

左ペインの「リモート エクスプローラー」をクリックする

![scr 2024-06-25 155522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ad812a4a-12ac-7563-9481-0cab5092d1ef.png)

「＋」（新しい開発コンテナー）をクリックする

![scr 2024-06-25 155629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6e057808-2059-a155-a938-3ad52561cc7c.png)

「コンテナーで現在のフォルダーを開く」をクリックする

![scr 2024-06-25 155642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b2a14300-05b1-4924-81ea-6309681b62d4.png)

「ワークスペースに構成を追加する」をクリックする

![scr 2024-06-25 155656.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/c4f77d0c-c9ce-d54d-eb7c-9191e2a1d8eb.png)

「'Dockerfile'から<br>　コンテナー構成の既存の 'Dockerfile' を参照してください」をクリック

![scr 2024-06-25 155708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ffe4ebe5-d932-f364-61d5-e2fe83f8a096.png)

もし、「'Dockerfile'が見つかりません」エラーとなったときは、ファイル名のスペル誤りか「保存」忘れ。見直して『「リモート エクスプローラー」をクリック』からやり直す。

:::note warn
実は、上記のスクショを撮っている段階では、`Dockerfile`ファイルの「保存」を忘れており、「'Dockerfile'が見つかりません」エラーとなって悩みました。
:::

追加機能は不要。「OK」をクリック

![scr 2024-06-25 155716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/d70ab5a1-910e-6f37-6b22-29a77372f519.png)

## 3.3 コンテナーが起動される

コンテナーが作成・起動されると、ターミナルが開く。
swiftが起動していることを確認するために、`swift --version`を実行し、バージョンが表示されたら問題なし。

![scr 2024-06-25 155821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/15525981-54f1-cd77-f035-c04a51d70a45.png)

_『「main.swift」ファイルが見つからない』は、後で作成するので 今は無視してよい。_

## 3.4 コンテナーにVSCode拡張機能をインストールする

LOCAL-インストール済みの中から Swift拡張機能を見つける。
歯車アイコンをクリックして出てくるメニューから「devcontainer.json に追加」をクリック

![scr2 2024-06-25 165030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/685b988e-a0a7-ff26-ef05-f8225a8181be.png)

「拡張機能が開発コンテナーの構成に追加されました」を確認する。

![scr2 2024-06-25 165051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/635ca352-4468-b8af-b66a-c738b7243f6b.png)

ただし、この時点では、本当はまだ追加されていない。
左下の青いところをクリック、上部のメニューから「コンテナーのリビルド」をクリック。

自動的に「コンテナーをリビルド」しますか？と聞かれる場合もある。その場合は「Rebuild」をクリックすればよい。

![scr2 2024-06-25 165110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a1213988-b150-d3e9-9fb2-2f7f18c9c715.png)

「開発コンテナー」に Swift拡張機能が追加されたことを確認する。また、`devcontainer.json`を開くと、Swift拡張機能が追加されていることが確認できる。

![scr2 2024-06-25 165514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/36a4ef71-6ab4-3f6b-f277-5b6da22e1a08.png)

_CodeLLDB は、Swift拡張機能と一緒にインストールされる。_


# 4. Swiftプロジェクト作成

順を追って説明します。

## 4.1 Swiftプロジェクトの初期化

引き続き、ターミナルで次のコマンドを実行する

```terminal
swift package init --type executable
```

![scr2 2024-06-25 164123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/f343a5e8-d682-3b8c-186c-877c3e983d30.png)

やっと、`swift run`で実行できるようになったはずだ。

ここで一度、VSCodeからフォルダを閉じる。

![scr2 2024-06-25 164314.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/30411a2f-c2af-00ba-4485-8089fa60673e.png)


## 4.2 再びフォルダーを開く

「最近使用した項目を開く」から `Swiftプロジェクトフォルダ`を見つけクリック、再びフォルダーを開きます。

![scr2 2024-06-25 164648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7833b962-0d1a-7e01-93cf-e6757cc72056.png)

`swift package init`後、初めて、プロジェクトフォルダを開くと、VSCodeのプロジェクト情報が自動で作成される（.vscodeサブフォルダやlaunch.jsonが自動で作成される）。
これが目的で、再度、開く必要があった。しかし、今のこの状態だと、コンテナーと紐付いていないため、もう一度、開発コンテナーのパスを開く必要がある。

:::note
ここの手順がめんどくさいのは、Swift環境がDockerにしかなく、Windowsネイティブには、Swiftがインストールされていない前提としたためです。
もし、Windowsネイティブにも、Swiftがインストールされているならば、Swiftプロジェクトのルートフォルダを作成したときに、一緒にSwiftプロジェクトの初期化も行ってしまえば、VSCodeの閉じたり開いたりが不要になる（手順4.1と4.2が不要）。

```swift
> mkdir swift #プロジェクトのルートフォルダを作成
> cd swift #プロジェクトフォルダに移動
> swift package init --type executable #Swiftプロジェクトの初期化
> code . #VSCodeでプロジェクトフォルダを開く
```
:::

# 5. Swiftプロジェクトコンテナーを開く

「最近使用した項目を開く」から`Swift開発コンテナー`を見つけてクリックする。

![scr3 2024-06-25 183045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/2fcaeefd-c92b-4c61-fd19-15dcf1b06cd9.png)

↓これで開いたVSCodeは、`Swiftプロジェクトフォルダ`と`Swift開発コンテナー`が紐付いた状態となっており、「使える」状態になっています。

![scr4 2024-06-25 183829.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/22a028ac-a1a7-57d7-9386-3aedf33cc65c.png)


では、デバッグ実行してみましょう。

# 6. デバッグ実行する


コードを少し書き換えます。

```swift
let message = "Hello, world!"
print(message)
```

## 6.1 ブレークポイントの設定


行番号のすぐ左側をクリックし、ブレークポイントを設定します。赤い丸「<font color="red">●</font>」です。

![scr2 2024-06-25 165701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/4580ecda-eeff-6847-757f-e70b983800cf.png)

## 6.2 デバッグ実行開始

左ペインの「実行とデバッグ」をクリック、上部の三角形「Debug Swift」をクリックして、デバッグ実行を開始します。

![scr2 2024-06-25 165725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/83f204c8-f432-37fd-0da4-62d399173b86.png)

すると、設定したブレークポイントで止まります。

「ターミナル」タブの横の「デバッグコンソール」をクリック。
デバッガーのコマンドを入力します。ここでは、変数`message`の内容を確認するために、`p message`を入力しenter。


![scr2 2024-06-25 165742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/59c8245d-fc83-5351-a0e1-844606e895d4.png)


すると、変数`message`の内容が表示されました。
String型で中身は"Hello, world!"ですね。Xcodeのデバッガーとほぼ同じです。

画面上部中央にあるデバッガーのツールバーで「続行」をクリックし、プログラムを続行する。最終的にはプログラムが終了する。

![scr2 2024-06-25 165755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/8faa8822-92c3-8352-f2b0-62e6e232cab9.png)

プログラムからの標準出力は、「ターミナル」タブに出力されています。

![scr4 2024-06-25 212040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/e771c2f9-11cb-b808-287e-922c3f885a14.png)



# 7. Swiftコンテナーの停止

左下の青いところをクリック、上部のメニューから「リモート接続を終了する」をクリック。

![scr5 2024-06-25 212917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6196ece2-3a50-59f0-57bd-af21f2a396f9.png)

再び起動する場合は、手順5 の「最近使用した項目を開く」からSwift開発コンテナーを見つけてクリックすれば良い。


# 8. その他

- Docker Desktopを起動しておけば、他の操作はすべてVSCode内で閉じるところが、今回の方法のよいところです。<br>　
手順2「Swiftプロジェクトのルートフォルダを作成」において、Windowsターミナル（一般ユーザのPowerShell）からコマンドを打つ操作をしましたが、これもVSCode内の（ローカル環境の）ターミナルからでも可能。<br>　

- 今回の手順は、一つのSwiftプロジェクトが一つのDockerコンテナーとなります。複数のプロジェクトを並行に扱う場合は、それぞれのDockerコンテナーの区別が付くように、手順3.3にてコンテナーが作成されたときに生成される`devcontainer.json`内の`name`を固有のプロジェクト名称に書き換えておくとよいでしょう。
  ```json:devcontainer.json
    {
      //"name": "Existing Dockerfile",
      //      changes to project name
        "name": "Swift XXX Project Dockerfile",
        "build": {
            "context": "..",
            "dockerfile": "../Dockerfile"
        },
        "customizations": {
            "vscode": {
                "extensions": [
                    "sswg.swift-lang"
                ]
            }
        }
    }
  ```
  
<br>　  

- 手順3.4に Dockerコンテナー内に Swift拡張機能を追加する手順がありますが、上記json の該当部分をコピーすれば、GUIでの操作は省略できます。その場合も「コンテナーのリビルド」を忘れないこと。<br>　  

- 今回の手順で作成したが、停止されていて使わなくなったコンテナーやイメージは、Docker Desktop や Dockerコマンド で削除して構わない。<br>再び使う場合は、VSCodeからプロジェクトフォルダーを開き、左下の青いところをクリック、上部のメニューから「コンテナーで再度開く」をクリックすると、上記の`devcontainer.json`から再構成してくれます。  
![scr6 2024-06-25 220332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/bf3f1fc1-cdcc-0f84-5a79-671ea46059b1.png)<br>　 

- 開発コンテナーは　WSLでインストールした Ubuntuが動いています。ここにライブラリを追加する場合は、`apt-get install -y xxxx`コマンドで可能ですが、コンテナーを停止すると消えてしまいます（おそらく）。<br>恒久的に必要なライブラリは、最初に作成した`Dockerfile`に書いておくこと。リポジトリ更新のため、`apt-get update`は必須だが、`sudo`は不要。
  ```text:Dockerfile
  FROM swift:latest
  RUN apt-get update && apt install -y figlet
  RUN /bin/bash
  ```
  
　![scr7 2024-06-25 231509.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/9bdbf84c-532c-f301-6e00-4199a85b9ad2.png)