6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DockerのElixir環境にVSCodeでリモート接続してデバッグする【Windows環境】

Last updated at Posted at 2019-10-02

Dockerコンテナ上に構築された環境にVSCodeからリモートアクセスしてデバッグまでできるそうなので、Elixirで試してみました。なお、せっかくなのでErlang、Elixirのバージョンは2019/10/1時点で最新のものを使っていきたいと思います。

環境

  • Windows 10 Pro 64bit
  • VSCode 1.38.1
  • Docker Desktop for Windows 2.1.0.3
  • Docker Engine 19.03.2

事前準備

こちらを参考に以下をインストールしました。

  • VSCodeのインストール
  • VSCodeのリモート開発の拡張機能インストール
  • Dockerのインストール

Dockerfileの作成

  • 作業用ディレクトリを作り、VSCodeで開きます。

  • F1キーを押してコマンドパレットを開き、 Remote Containers: Add Development Container Configuration Files...を実行します。
    image.png

  • ベースとなる開発環境を選択しますが、DockerFileを編集するので何でも良いです。とりあえずUbuntu 18.04 & Gitを選択します。
    image.png

  • 作業用ディレクトリに.devcontainerディレクトリが作成され、devcontainer.jsonDockerfileが自動生成されますので、DockerfileをElixir環境用に変更します。

    • Elixri1.9.1のDockerfileの内容をコピーして自動生成されたDockerfileに上書きします。
    • Elixri1.9.1のDockerfileから以下の箇所を変更しました。
      • LANGUAGE、LC_ALLの追加
      • mix local.hexの実行を追加
      • iexの起動の削除
FROM erlang:22

# elixir expects utf8.
ENV ELIXIR_VERSION="v1.9.1" \
-	LANG=C.UTF-8
+	LANG=C.UTF-8 \
+	LANGUAGE=C.UTF-8 \
+	LC_ALL=C.UTF-8

RUN set -xe \
	&& ELIXIR_DOWNLOAD_URL="https://github.com/elixir-lang/elixir/archive/${ELIXIR_VERSION}.tar.gz" \
	&& ELIXIR_DOWNLOAD_SHA256="94daa716abbd4493405fb2032514195077ac7bc73dc2999922f13c7d8ea58777" \
	&& curl -fSL -o elixir-src.tar.gz $ELIXIR_DOWNLOAD_URL \
	&& echo "$ELIXIR_DOWNLOAD_SHA256  elixir-src.tar.gz" | sha256sum -c - \
	&& mkdir -p /usr/local/src/elixir \
	&& tar -xzC /usr/local/src/elixir --strip-components=1 -f elixir-src.tar.gz \
	&& rm elixir-src.tar.gz \
	&& cd /usr/local/src/elixir \
	&& make install clean \
+	&& cd $HOME \
+	&& mix local.hex --force

- CMD ["iex"]
  • devcontainer.jsonでコンテナ名が定義できます。nameの値を任意の名前に変更します。
    image.png

コンテナにリモート接続し、拡張機能を有効化する

ここまで出来たらコンテナを立ち上げ、VSCodeからリモート接続します。

  • VSCodeの左下のリモートウィンドウを開くを押すとリモート機能に関するメニューが出てくるので、Remote-Containers: Reopen in Containerを選択します。そうすると、コンテナのビルドが行われリモート接続が完了します。
    image.png
    image.png
    image.png

  • ターミナルを表示し、elixir -vを実行してバージョンを確認します。Erlang/OTP:22、Elixir:1.9.1がインストールされていることが確認できました。
    image.png

  • リモートコンテナでは、ローカル環境でインストールしていた拡張機能が適用されていないため、Elixir関連の以下の拡張機能を有効にしておきます。インストールしたら再読み込みします。

    • vscode-elixir
    • ElixirLS
    • ElixirFormatter

image.png
image.png

Elixirでコードを動かす

とりあえずHelloWorldが動くことを確認します。

  • mix new helloで動作確認用プロジェクトを作成します。ターミナルを表示しcd helloを行いHelloプロジェクトのディレクトリへ移動します。
  • VSCodeのエクスプローラーからhello/lib/hello.exを選択して開きます。Helloモジュールにhello関数ができているため、関数名をworldに変更します。docも併せて変更しておきます。変更が終わったら保存します。
defmodule Hello do
  @moduledoc """
  Documentation for Hello.
  """

  @doc """
  Hello world.

  ## Examples

-      iex> Hello.hello()
+      iex> Hello.world()
      :world

  """
-  def hello do
+  def world do
    :world
  end
end
  • ターミナルでiex -S mixを実行し、プロジェクトのモジュールをiexで開きます。Hello.world:woldが返ってくることが確認できました。Ctrl + Cを2回押してiexを終了します。
    image.png

ブレークポイントを張ってデバッグする

デバッグが可能であることを確認します。

  • VSCodeのデバッグウィンドウを開きます。デバッグ構成が無いので、構成の追加...を押してデバッグ構成を追加します。
    image.png

  • launch.jsonにデフォルトのデバッグ構成が追加され開かれます。projectDir${workspaceRoot}になっており、このままではmix.exsが見つからないためエラーとなるので、{workspaceRoot}/helloに変更します。
    image.png

  • hello/lib/hello.exを開き、デバッグ確認用のコードを追加します。

defmodule Hello do
  @moduledoc """
  Documentation for Hello.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Hello.world()
      :world

  """
  def world do
+	x = 1
+	x = 2
    :world
  end
end
  • hello/test/hello_test.exsのテストコードが自動生成されたままとなっているので、関数名を変更します。変更した行にブレークポイントを設定します。
defmodule HelloTest do
  use ExUnit.Case
  doctest Hello

  test "greets the world" do
-    assert Hello.hello() == :world
+    assert Hello.world() == :world
  end
end

image.png

  • デバッグウィンドウを開き、デバッグ構成でmix testを選択した上でデバッグを開始します。ブレークポイントで止まっていることが確認できました。また、デバッグ確認用のコードがステップ実行できることも確認できました。
    image.png
    image.png

所感

コンテナなのでローカル環境に影響が無い。コーディングはVSCodeの機能を活用できる。ローカルのディレクトリをマウントしているため、コンテナを終了しても成果物が残り続ける。結構良い感じなのではないでしょうか。次はコンテナ内でビルドする必要があるためにコーディングが中々捗らなかったElixirをAWS Lambdaで動かすための環境を整えたいと思います。

参考

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?