Closed12

Dev ContainerでFlutter on the Web開発をしたいと思ったけど、asdfで管理することにした

Hiroya-WHiroya-W

そもそもFlutterが初めてなので良く分かっていない。色々記事を読んでどうやっているのかをまとめてみる

Hiroya-WHiroya-W
  1. Ubuntuイメージをベースに、aptでパッケージを追加していくタイプ

https://github.com/lucashilles/flutter-dev-container/blob/master/.devcontainer/Dockerfile

基本的なFlutterはAndroidやiOS向けにビルドするので、そのための環境やエミュレータ、エミュレータのウィンドウをDocker内から外向きに飛ばす必要があって面倒くさい。
ちなみに、今回はFlutter on the Web開発がしたいので、別にAndroidとかデバイス用のSDKはいらないのでは?と思っている

https://github.com/GDSCParulUniversity/flutter-devcontainer/blob/main/Image/Dockerfile

Flutter SDKというのが必要そうで、なんかgit cloneで取得できるようなものっぽい。公式のInstall手順
https://docs.flutter.dev/get-started/install/linux
はtar.gzを落としてきているけど、その中身はおそらくGitのものと同じってことなんだろう。

  1. Dartイメージをベースにインストールする方法
    https://zenn.dev/nagakuta/scraps/39449e6c92b8f3

そういえば、FlutterはDartで書くんだった。Dartが必要になるので、ベースはDartイメージから始めるという手はありかもしれない。

DevContainer向けイメージで公式が配布しているDartのイメージはあるかな?

Hiroya-WHiroya-W

https://github.com/microsoft/vscode-dev-containers/tree/main/containers/dart/.devcontainer

あった(過去型)。今は?

https://github.com/devcontainers-community/templates/blob/30-create-dart-template/src/dart/.devcontainer/devcontainer.json

featuersを使う方法がある?みたいだが、今はもうサジェストに出てこないし、書いてみてもコンテナは起動しなかった。

https://github.com/devcontainers-community/features

一覧に書かれていないので、また別のリポジトリに移管されたっぽいか?

https://github.com/devcontainers-community/features-dart-sdk

これか。動かないけど。開発が難しいんやろうなぁ...。

Hiroya-WHiroya-W

とりあえず、開発が難しそうな感じということが分かったので、DevContainerの機能に頼らず自分でセットアップしていこうと思う。

Hiroya-WHiroya-W

fvmってなーんだ?
FVM(Flutter Version Management)で、Flutter SDKのバージョン管理をするためのツール。バージョン切り替えをプロジェクトごとにできるようにするので、基本的にはFVMに載せるのが良さそうだね。
https://fvm.app/documentation/getting-started

Hiroya-WHiroya-W

とりあえず、Dartの公式イメージをベースに、DevContainerのテンプレートを作ってみる。

.devcontainer/Dockerfile
FROM dart:3.3
devcontainer/devcontainer.json
{
    "name": "Flutter DevContainer",
    "build": {
        "dockerfile": "Dockerfile"
    },
    "workspaceFolder": "/workspaces",
    "customizations": {
        "vscode": {
            "extensions": [
                "dart-code.flutter"
            ]
        }
    },
    "features": {
        "ghcr.io/devcontainers/features/common-utils:2": {}
    },
    "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces,type=bind,consistency=cached",
    "remoteUser": "vscode"
}
Hiroya-WHiroya-W

Dockerfileの実行時はrootユーザなので、

dart pub global activate fvm

でインストールされるfvmへのパスは /root/.pub-cache/bin になる。しかし、/rootへの権限がvscodeユーザにはないのでバイナリを実行できない。

仕方がないので、Releaseからtar.gzを取得してバイナリだけ配置するようにする。

https://github.com/leoafarias/fvm/releases/

Hiroya-WHiroya-W
.devcontainer/Dockerfile
FROM dart:3.3

ENV PATH="/opt/fvm:${PATH}"

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    curl \
    git \
    wget \
    unzip \
    xz-utils \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ARG FVM_VERSION=3.0.6
ARG ARCH=arm64
RUN wget https://github.com/leoafarias/fvm/releases/download/${FVM_VERSION}/fvm-${FVM_VERSION}-linux-${ARCH}.tar.gz \
    && tar xvf fvm-${FVM_VERSION}-linux-${ARCH}.tar.gz \
    && mv fvm /opt/ \
    && chmod +x /opt/fvm/fvm \
    && rm fvm-${FVM_VERSION}-linux-${ARCH}.tar.gz

ARG FLUTTER_VERSION=3.19.0
RUN fvm install ${FLUTTER_VERSION} \
    && fvm use ${FLUTTER_VERSION} --force --skip-setup \
    && fvm global ${FLUTTER_VERSION}

とすれば出来た。しかし、結局fvm installした際に配置される場所は/root/.fvm下になるらしい。これではvscodeユーザから fvm listとしても既にインストールしたFlutter SDKを見つける事ができない。

Hiroya-WHiroya-W

そもそも、Flutter SDKはDockerイメージ内では固定される予定(このプロジェクトで使うFlutter SDKを入れるところまでやってしまう)なので、別にFVMを使わなくてもGitで落としてくる方法でもありなのでは、という気もしてきた。

Gitで落としてくる方法でも良いが、コミット数が多いリポジトリなので、タグごとに生成されたtar.gzを落としてくる方法の方が軽そうに思える。
しかし、Flutter SDKとしてはGitリポジトリである必要があるようなので、GitでCloneしていく。

Error: The Flutter directory is not a clone of the GitHub project.
       The flutter tool requires Git in order to operate properly;
       to install Flutter, see the instructions at:
       https://flutter.dev/get-started
.devcontainer/Dockerfile
FROM dart:3.3

ARG FLUTTER_VERSION=3.19.0
ARG FLUTTER_SDK_PATH=/opt/flutter

ENV PATH="${PATH}:/opt/flutter/bin"

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    curl \
    git \
    wget \
    unzip \
    xz-utils \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/flutter/flutter.git ${FLUTTER_SDK_PATH} -b ${FLUTTER_VERSION} \
    && chmod -R 777 ${FLUTTER_SDK_PATH}

とすると出来た。これだけでいいのか。もしかして、asdfでDartとFlutterを管理すればいいだけなのでは?

Hiroya-WHiroya-W

asdfとFVMは共存出来ないという記事を多く見かける。Flutter SDKへのパスも異なるので、VSCodeでの設定も変わってくるのだろう。
asdfでFlutterを入れるのではなく、asdfでDartを入れ、そのDartでFVMをインストールし、Flutterを管理する。これで対応した。

Hiroya-WHiroya-W

Initial Setup

Dart

asdf add plugin dart
asdf install dart 3.3.0
asdf local dart 3.3.0

Flutter

Flutter SDK

dart pub global activate fvm
fvm install 3.19.0
fvm use 3.19.0

Create Flutter App

fvm flutter create .

Setup(after Inital Setup)

fvm install

Run Flutter App

fvm flutter run -d chrome
このスクラップは2024/02/18にクローズされました