Docker x Code-Server で Swift x VSCode 

Swift の学習をしたかったので、Docker Container の VSCODE と Swift を入れて、
開発環境を作成してみた。(AWS Cloud9 ライクに動作します)

Auto-Complete も効いて中々便利です。
オンライン上の置くこともできるので、少し工夫すれば、あらゆるところで、
Swiftで遊ぶことができます。


## 使い方

#### (1) Docker Image を起動して、VSCodeを立ち上げる。

```
docker build -t swift_code .
docker run --privileged -p8080:8080 -p8443:8443 -it swift_code
```

※ --privileged が必要っぽい

#### (2) ブラウザーを”http://127.0.0.1:8443/”を起動して、VSCodeを開く。
ipは環境によって違います。 (Windows は docker-machine ip とかでわかるかも)

![root_page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/2ffb745e-8ec2-4242-ce47-84143ac85468.jpeg)


#### 自由自在にプログラム
※ File->Preference->Setting->SourceKit-Lsp の ToolChainは / にしてね。

※ mountして、変更内容を、Descktop PCに反映させたい場合は、 -v optionをつけたり

```
docker run --privileged -v/xxx/xx/x:/app -p8080:8080 -p8443:8443 -it swift_code

```

※ 今回はport 8080 を開けているので、例えば、

```
$ bash
$ python -m SimpleHTTPServer  8080
```
とすると、ブラウザーで、起動しているサーバーにアクセスすることもできます。

<img width="823" alt="Screen Shot 2019-08-18 at 3.08.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/4e133bf0-1485-0fe8-b56c-94a2eed7c48c.png">



 

## 環境構築

#### Docker ファイルの中身

適当に書いたので、長期間もちませませんが、以下のようにしました。

```
#
# docker build -t swift.streamini .
# docker run --privileged  -p8080:8080 -p8443:8443 -it swift.streamini 
#
FROM ubuntu:18.04

RUN apt-get update --fix-missing
RUN apt-get upgrade -y
#RUN dpkg -i /var/cache/apt/archives/linux-libc-dev_4.15.0-55.60_amd64.deb
#RUN apt-get install linux-libc-dev -y
RUN apt-get install clang -y --fix-missing
RUN apt-get install curl wget -y
WORKDIR /works
WORKDIR /app
WORKDIR /works
RUN wget https://github.com/cdr/code-server/releases/download/2.preview.5-vsc1.37.0/code-server2.preview.5-vsc1.37.0-linux-x86_64.tar.gz
RUN tar --strip-components 1 -xzf code-server2.preview.5-vsc1.37.0-linux-x86_64.tar.gz

#
# swift
#
# copy from  https://github.com/apple/swift-docker/blob/master/5.0/ubuntu/18.04/Dockerfile
#
RUN export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true && \
    apt-get -q install -y \
    libatomic1 \
    libbsd0 \
    libcurl4 \
    libxml2 \
    libedit2 \
    libsqlite3-0 \
    libc6-dev \
    binutils \
    libgcc-5-dev \
    libstdc++-5-dev \
    libpython2.7 \
    tzdata \
    git \
    pkg-config \
    && rm -r /var/lib/apt/lists/*

# Everything up to here should cache nicely between Swift versions, assuming dev dependencies change little
ARG SWIFT_PLATFORM=ubuntu18.04
ARG SWIFT_BRANCH=swift-5.0.2-release
ARG SWIFT_VERSION=swift-5.0.2-RELEASE

ENV SWIFT_PLATFORM=$SWIFT_PLATFORM \
    SWIFT_BRANCH=$SWIFT_BRANCH \
    SWIFT_VERSION=$SWIFT_VERSION

RUN wget https://swift.org/builds/swift-5.1-branch/ubuntu1804/swift-5.1-DEVELOPMENT-SNAPSHOT-2019-08-16-a/swift-5.1-DEVELOPMENT-SNAPSHOT-2019-08-16-a-ubuntu18.04.tar.gz
#https://swift.org/builds/swift-5.0.2-release/ubuntu1804/swift-5.0.2-RELEASE/swift-5.0.2-RELEASE-ubuntu18.04.tar.gz
RUN tar --strip-components 1  -xzf swift-5.1-DEVELOPMENT-SNAPSHOT-2019-08-16-a-ubuntu18.04.tar.gz --directory /
RUN chmod -R o+r /usr/lib/swift



WORKDIR /works
RUN git clone https://github.com/apple/sourcekit-lsp.git
WORKDIR /works/sourcekit-lsp
#RUN git checkout tags/swift-5.1-DEVELOPMENT-SNAPSHOT-2019-06-26-a
RUN apt-get update 
RUN apt-get install libsqlite3-dev -y
RUN apt-get install libdispatch-dev -y
#RUN swift build -Xcxx -I/usr/lib/swift 
RUN apt-get install libncurses5-dev -y
RUN apt-get install libncurses5 -y
RUN swift build -Xcxx -I/usr/lib/swift 
RUN swift package update
RUN apt-get install nodejs -y
RUN apt-get install npm -y
ENV PATH="/works/sourcekit-lsp/.build/debug:${PATH}"
WORKDIR /works/sourcekit-lsp/Editors/vscode
RUN npm run createDevPackage
RUN /works/code-server --install-extension out/sourcekit-lsp-vscode-dev.vsix
CMD [ "/works/code-server", "--allow-http", "--no-auth","--port","8443", "/works" ]

```

#### Swift Plugin 
Swift plugin は使わず、Apple が作成中の、LSPを利用しています。
https://github.com/apple/sourcekit-lsp.git を利用しています。

LSPは、様々な　Editor や 開発環境でオートコンプリートなどの機能を提供しようとして、
Microsft が提唱しているものです。

https://code.visualstudio.com/api/language-extensions/language-server-extension-guide

とっても便利ですね。
LSPならば、VSCode 向けの Pluginを、自作のEditorなどでも動作させるのを
容易に実現できそうですね。

#### バージョンをあわせる

不足していえうライブラリーや、LSPようにバージョンを合わせたりと
結構大変でした。

例えば、LSPのSwift5.1はブランチを見ろと書かれていましたが、
Masterが既にSwift5.1でした。


素直に、Swift Docker Image を使うのが良いと思います。
https://github.com/apple/swift-docker 

その場合、LSPについては、最新の環境を使えば良いと思います。
Swift5.1で開発の最新といった感じにすると、事故が少ないかと


また、Swift Docker Image は ubuntu ベースなので、Code-Server が動きます。つまり、VSCODEが動きます。ということは、今回の環境がストレスなく作れることを意味しています。

便利



## PS

今回の作成したものは、以下にあります。
https://github.com/kyorohiro/my-code-server