在 Github CodeSpaces 里面运行 flutter

59 min read

创建开发环境配置

在根目录下创建 .devcontainer, 里面包含flutter开发所需要的开发镜像和配置

// devcontainer.json

FROM debian:stretch

RUN apt-get update && apt-get -y install git curl unzip wget

RUN apt-get autoremove -y \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*

RUN mkdir /home/vscodespace
WORKDIR /home/vscodespace

ENV PUB_CACHE=/home/vscodespace/.pub_cache
ENV PATH="/home/vscodespace/flutter/bin:$PATH"

RUN git clone https://github.com/flutter/flutter && \
    /home/vscodespace/flutter/bin/flutter config --enable-web
// devcontainer.json



{
  "build": {
    "dockerfile": "Dockerfile"
  },
  "settings":{
    "terminal.integrated.shell.linux":"/bin/bash",
  },
  "name": "Flutter",
  "extensions": ["Dart-Code.dart-code", "Dart-Code.flutter","auchenberg.vscode-browser-preview",],
  "forwardPorts": [3000]
}

以后配置完成后, CodeSpace 会提醒重新 rebuild 该环境

We've noticed a change to the devcontainer configuration. Rebuild the container to apply them now.

Rebuilding recreates your codespace. Your code and any current changes will be preserved, but your codespace will be rebuilt using your working directory's devcontainer.

通过"terminal.integrated.shell.linux":"/bin/bash", 暴露可执行文件,可以在CodeSpace环境下使用命令行直接运行 flutter

Github Codespace 启动Flutter开发环境

目前并不支持模拟器, 仅支持 web 端的调试

flutter run -d web-server --web-hostname=0.0.0.0 --web-port=3000

Github Codespace 启动Flutter 报错

This codespace is currently running in recovery mode due to a container error. Review the creation logs, update your devcontainer configuration as needed, and run the "Rebuild Container" command to retry.

查看日志

2022-06-18 07:42:58.388Z: Configuration starting...
2022-06-18 07:42:59.134Z: @microsoft/vscode-dev-containers-cli 0.62.0.
2022-06-18 07:42:59.169Z: Start: Resolving Remote
2022-06-18 07:42:59.185Z: $ /usr/bin/node /usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js up --user-data-folder /var/lib/docker/codespacemount/.persistedshare --container-data-folder .vscode-remote/data/Machine --container-system-data-folder /var/vscode-remote --workspace-folder /var/lib/docker/codespacemount/workspace/flower_flutter --id-label Type=codespaces --log-level info --log-format json --config /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer/devcontainer.json --override-config /root/.codespaces/shared/merged_devcontainer.json --default-user-env-probe none --remove-existing-container --mount type=bind,source=/.codespaces/agent/mount/cache,target=/vscode --skip-post-create --update-remote-user-uid-default never --mount-workspace-git-root false
2022-06-18 07:42:59.246Z: @microsoft/vscode-dev-containers-cli 0.62.0.
2022-06-18 07:42:59.261Z: Start: Resolving Remote
2022-06-18 07:42:59.276Z: $ docker ps -q -a --filter label=Type=codespaces
2022-06-18 07:42:59.302Z: Stop (37 ms): Run: docker ps -q -a --filter label=Type=codespaces
2022-06-18 07:42:59.317Z: $ docker build -f /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer/Dockerfile -t vsc-flower_flutter-af8f805687818d527316e9c15f8b912f /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer
2022-06-18 07:42:59.498Z: #2 [internal] load .dockerignore
2022-06-18 07:42:59.524Z: #2 sha256:972fb0b353a1788a2a79d0106f913edb5ecf24db689a30584bdcb56f286edbb0
2022-06-18 07:42:59.639Z: #2 ...
2022-06-18 07:42:59.664Z: 
2022-06-18 07:42:59.687Z: #1 [internal] load build definition from Dockerfile
2022-06-18 07:42:59.710Z: #1 sha256:6f3273087f7b42704ef1ea934fe773eeeea456a36305064502058634a0bfebca
2022-06-18 07:42:59.733Z: #1 transferring dockerfile: 2B done
2022-06-18 07:42:59.756Z: #1 DONE 0.3s
2022-06-18 07:42:59.780Z: 
2022-06-18 07:42:59.804Z: #2 [internal] load .dockerignore
2022-06-18 07:42:59.826Z: #2 sha256:972fb0b353a1788a2a79d0106f913edb5ecf24db689a30584bdcb56f286edbb0
2022-06-18 07:42:59.848Z: #2 transferring context: 2B done
2022-06-18 07:42:59.872Z: #2 DONE 0.3s
2022-06-18 07:42:59.893Z: 
2022-06-18 07:42:59.915Z: failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount321912434/Dockerfile: no such file or directory
2022-06-18 07:42:59.938Z: Stop (493 ms): Run: docker build -f /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer/Dockerfile -t vsc-flower_flutter-af8f805687818d527316e9c15f8b912f /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer
2022-06-18 07:42:59.959Z: Error: Command failed: docker build -f /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer/Dockerfile -t vsc-flower_flutter-af8f805687818d527316e9c15f8b912f /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer
2022-06-18 07:42:59.983Z:     at Tu (/usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js:221:3219)
2022-06-18 07:43:00.008Z:     at processTicksAndRejections (internal/process/task_queues.js:95:5)
2022-06-18 07:43:00.030Z:     at async LR (/usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js:221:1567)
2022-06-18 07:43:00.053Z:     at async zy (/usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js:221:594)
2022-06-18 07:43:00.075Z:     at async $R (/usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js:226:2007)
2022-06-18 07:43:00.097Z:     at async Zy (/usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js:226:3112)
2022-06-18 07:43:00.118Z:     at async BR (/usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js:226:12448)
2022-06-18 07:43:00.139Z:     at async qR (/usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js:226:12204)
2022-06-18 07:43:00.161Z: Stop (652 ms): Run: /usr/bin/node /usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js up --user-data-folder /var/lib/docker/codespacemount/.persistedshare --container-data-folder .vscode-remote/data/Machine --container-system-data-folder /var/vscode-remote --workspace-folder /var/lib/docker/codespacemount/workspace/flower_flutter --id-label Type=codespaces --log-level info --log-format json --config /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer/devcontainer.json --override-config /root/.codespaces/shared/merged_devcontainer.json --default-user-env-probe none --remove-existing-container --mount type=bind,source=/.codespaces/agent/mount/cache,target=/vscode --skip-post-create --update-remote-user-uid-default never --mount-workspace-git-root false
2022-06-18 07:43:00.183Z: Exit code 1
2022-06-18 07:43:00.204Z: Failed to create container.
2022-06-18 07:43:00.224Z: Error: Command failed: /usr/bin/node /usr/lib/node_modules/@microsoft/vscode-dev-containers-cli/dist/spec-node/devContainersSpecCLI.js up --user-data-folder /var/lib/docker/codespacemount/.persistedshare --container-data-folder .vscode-remote/data/Machine --container-system-data-folder /var/vscode-remote --workspace-folder /var/lib/docker/codespacemount/workspace/flower_flutter --id-label Type=codespaces --log-level info --log-format json --config /var/lib/docker/codespacemount/workspace/flower_flutter/.devcontainer/devcontainer.json --override-config /root/.codespaces/shared/merged_devcontainer.json --default-user-env-probe none --remove-existing-container --mount type=bind,source=/.codespaces/agent/mount/cache,target=/vscode --skip-post-create --update-remote-user-uid-default never --mount-workspace-git-root false
2022-06-18 07:43:00.240Z: Error Code: 1302
2022-06-18 07:43:00.256Z: Container creation failed.
2022-06-18 07:43:00.271Z: 
2022-06-18 07:43:00.287Z: Creating recovery container.

上述报错大意是 Dockerifle 文件没有找到, 重写 Dockerfile 文件同,按照控制台输出的方法 rebuild 开发环境

This codespace is currently running in recovery mode due to a container error.

  1. Use Cmd/Ctrl + Shift + P -> "Codespaces: View Creation Log" to see full logs
  2. Update your devcontainer configuration as needed
  3. Use Cmd/Ctrl + Shift + P -> "Codespaces: Rebuild Container" to retry
  4. For help, read more about custom configuration: https://aka.ms/ghcs-custom-configuration

切换到 Flutter 的指定版本

老版本

Tag Flutter Version Flutter Channel
2.0.1 2.0.1 stable
1.22.5 1.22.5 stable
1.22.4 1.22.4 stable
1.22.3 1.22.3 stable
1.22.2 1.22.2 stable
1.22.1 1.22.1 stable
1.22.0 1.22.0 stable
1.20.4 1.20.4 stable
1.20.3 1.20.3 stable
1.20.2 1.20.2 stable
1.20.1 1.20.1 stable
1.20.0 1.20.0 stable
1.17.5 1.17.5 stable
1.17.4 1.17.4 stable
1.17.3 1.17.3 stable
1.17.2 1.17.2 stable
1.17.1 1.17.1 stable
1.17.0 1.17.0 stable
v1.12.13-hotfix.9 v1.12.13+hotfix.9 stable
v1.12.13-hotfix.8 v1.12.13+hotfix.8 stable
v1.12.13-hotfix.7 v1.12.13+hotfix.7 stable
v1.12.13-hotfix.5 v1.12.13+hotfix.5 stable
v1.9.1-hotfix.6 v1.9.1+hotfix.6 stable
v1.9.1-hotfix.5 v1.9.1+hotfix.5 stable
v1.9.1-hotfix.4 v1.9.1+hotfix.4 stable
v1.9.1-hotfix.2 v1.9.1+hotfix.2 stable
v1.7.8-hotfix.4 v1.7.8+hotfix.4 stable

创建 Flutter 对应版本的镜像

FROM debian:stretch

RUN apt-get update && apt-get -y install git curl unzip wget

RUN apt-get autoremove -y \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*

RUN mkdir /home/vscodespace
WORKDIR /home/vscodespace

ENV PUB_CACHE=/home/vscodespace/.pub_cache
ENV PATH="/home/vscodespace/flutter/bin:$PATH"

RUN git clone https://github.com/flutter/flutter && \
    cd flutter && \
    git checkout 1.22.6 && \
    /home/vscodespace/flutter/bin/flutter config --enable-web

通过命令行来指定 Flutter 版本

查看版本: flutter --version
检查环境:flutter doctor
查看渠道:flutter channel
切换渠道(stable, beta, dev, master):flutter channel stable
升级到最新版本:flutter upgrade 
升级到指定版本:flutter upgrade v2.2.3
回退到指定版本:flutter downgrade v2.0.3