nixos下flutter开发环境

nixos 下开发环境可以独立配置,较为简单的开发环境类似 golang nodejs等较为简单。而flutter将对来说较为复杂。 先看nixos 下开发环境可以独立配置。 在现有的flutter项目目录下,或者打算储存flutter项目的目录里面创建一个flake.nix 文件内容如下。

flake.nix

nix develop --impure --show-trace 命令进入flutter环境

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 注意dl.google.com 有可能会被域名分流掉代理,实际只要解析没问题国内可以直连
# idea 打开项目后提示没有dart sdk 不用管,直接配置flutter的sdk 这里是 /nix/store/wkaqj97xj7glb0a0za3iplwcj95jm6mj-flutter-wrapped-3.19.0-sdk-links
# flutter pub get
{
  description = "Flutter 3.19.x";
  inputs = {
    # nixpkgs.url = "github:NixOS/nixpkgs/23.11";
    # https://mirrors.ustc.edu.cn/nix-channels/nixpkgs-unstable/nixexprs.tar.xz?narHash=sha256-LuNFBL0P7GGtv6dNmLbD5MeyGlor0uV2482QhZRwbI8%3D' (2024-04-04)
    nixpkgs.url = "https://mirrors.ustc.edu.cn/nix-channels/nixpkgs-unstable/nixexprs.tar.xz";

    flake-utils.url = "github:numtide/flake-utils";
  };
  # build-tools-30-0-3 platforms-android-33
  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs {
          inherit system;
          config = {
            android_sdk.accept_license = true; #貌似无效但是不影响使用
            allowUnfree = true;
          };
        };
        # platforms;android-33 Android SDK Platform 33
        buildToolsVersion = "34.0.0";
        androidComposition = pkgs.androidenv.composeAndroidPackages {
          buildToolsVersions = [ buildToolsVersion "30.0.3" ];
          platformVersions = [ "34" "33" "29" "28" ]; #具体需要用那个版本 还是要看代码里面 以及真机/模拟器的版本
          abiVersions = [ "armeabi-v7a" "arm64-v8a" ];
        };
        androidSdk = androidComposition.androidsdk;
      in
      {
        devShell =
          with pkgs; mkShell rec {
            #真机调试需要配GRADLE_OPTS
            GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/34.0.0/aapt2"; # 30.0.3  34.0.0
            ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
            #ANDROID_HOME = "${androidSdk}/libexec/android-sdk";
            JAVA_HOME = "${pkgs.jdk17.home}";
            CHROME_EXECUTABLE = "${pkgs.chromium}/bin/chromium";
            buildInputs = [
              flutter319 # flutter316  flutter313 flutter=3.19
              androidSdk # The customized SDK that we've made above
              gradle #Gradle=8.6 gradle_7 gradle_6
              jdk17 # 最好指定版本,不然可能需要处理gradle和jdk版本的兼容 jdk="21"
              #ninja cmake glibc # linux下调试桌面应用用 需要自行装到 home.packages 装这里可能有问题,c和rust也需要所以不写这里
              fish
              chromium
              #jetbrains.idea-ultimate
            ];
            shellHook = ''
              echo " 你可能需要运行下面的命令 "
              echo " rm -rf ~/.pub-cache  "
              echo " rm -rf ~/.gradle  "
              echo " rm -rf ~/.dart  "
              echo " rm -rf ~/.dartServer  "
              echo " flutter pub get "
              exec fish
            '';
          };
      });
}

使用注意

这里没有用nix管理idea的插件,需要手动在idea安装 flutter和 android插件。

dar sdk

idea打开对应的项目的时候 会提示配置dart sdk 这是因为他没有识别的到这是flutter项目。不用例会,直接去配置flutter 的sdk即可。如果有多个版本和环境,可以cd到对应环境的/nix/store/xxx 检查版本,注意选择。

真机/模拟器调试 无法adb

当前用户组需要在 adbusers 组里,需要在configuration.nix 里配置

1
2
3
4
5
6
7
programs.adb.enable = true;
users.users.你的用户名 = {
  # ...其他配置项
  extraGroups = [
  # ... 其他用户组
    "adbusers"
]

其他错误

1、网络问题,注意科学上网环境和分流规则。需要东github和google下载一些文件。
2、版本匹配文件,检查项目里面的安卓配置相关的情况

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计