Docker容器执行melos bootstrap触发空检查运算符错误求助
Docker容器中执行
melos bootstrap触发Null检查运算符错误(本地运行正常) 问题背景
我通过Dockerfile容器化Dart应用,项目包含三个同级子包,使用melos工具实现批量构建。本地运行melos bootstrap完全正常,但在容器内执行时触发空检查运算符错误,错误栈指向pubspec的解析逻辑,而非业务代码。
项目结构
-- packages ---- package1 ---- package2 ---- package3
错误栈信息
# melos bs Unhandled exception: Null check operator used on a null value #0 new JsonParser (package:pubspec/src/json_utils.dart:87:48) #1 parseJson (package:pubspec/src/json_utils.dart:13:5) #2 new PubSpec.fromJson (package:pubspec/src/pubspec.dart:96:15) #3 PubSpec.loadFile (package:pubspec/src/pubspec.dart:128:15) <asynchronous suspension> #4 PackageMap.resolvePackages.<anonymous closure> (package:melos/src/package.dart:542:25) <asynchronous suspension> #5 Future.wait.<anonymous closure> (dart:async/future.dart:522:21) <asynchronous suspension> #6 PackageMap.resolvePackages (package:melos/src/package.dart:539:5) <asynchronous suspension> #7 MelosWorkspace.fromConfig (package:melos/src/workspace.dart:65:25) <asynchronous suspension> #8 _Melos.createWorkspace (package:melos/src/commands/runner.dart:100:13) <asynchronous suspension> #9 _BootstrapMixin.bootstrap (package:melos/src/commands/bootstrap.dart:5:23) <asynchronous suspension> #10 CommandRunner.runCommand (package:args/command_runner.dart:212:13) <asynchronous suspension> #11 MelosCommandRunner.runCommand (package:melos/src/command_runner.dart:80:5) <asynchronous suspension> #12 main (file:///root/.pub-cache/hosted/pub.dev/melos-2.9.0/bin/melos.dart:46:5) <asynchronous suspension>
配置文件
melos.yaml
packages: - packages/** scripts: analyze: exec: dart analyze . get: exec: dart pub get
Dockerfile
### main application image ### FROM dart:stable RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y cmake build-essential gperf libssl-dev zlib1g-dev \ && rm -rf /var/lib/apt/lists/* # Install packages RUN apt update \ && apt install -y \ libc++-dev \ && rm -rf /var/lib/apt/lists/* RUN rm -rf /app && mkdir -p /app COPY . /app ENV PATH="/root/.pub-cache/bin:${PATH}" WORKDIR /app RUN rm -rf packages/td_json_client/build && \ mkdir packages/td_json_client/build && \ cd packages/td_json_client/build && \ cmake -DCMAKE_INSTALL_PREFIX:PATH=/app/packages/td_json_client/lib/src/blobs/darwin/arm64 /app/packages/td_json_client/lib/src/log_callback && \ cmake --build . --target install RUN ls /app/packages/td_json_client/build RUN ls /app/packages/td_json_client/lib/src/blobs/darwin/arm64 RUN cp -r /app/packages/td_json_client/lib/src/blobs/darwin/arm64 /usr/local/lib/ RUN dart pub global activate melos # I commented out the code below so I could sh into the docker image # RUN melos bootstrap # RUN melos run get # CMD ["/app/packages/cli/bin/main.dart","login","-h","--api-id=","$API_ID", \ # "--api-hash=","$API_HASH","--phone-number=","$PHONE", \ # "--libtdjson-path=","$PATH_TD_JSON_LIB","--libtdjson-loglevel=","$LOG_LEVEL"]
已尝试操作
- 使用
--scope指定单个子包执行命令(如melos bootstrap --scope package/package1),仍触发相同错误。
预期结果
希望容器内执行结果与本地一致:
Running "dart pub get" in workspace packages... ✓ <packagename1> └> packages/<packagename1> ✓ <packagename2> └> packages/<packagename2> ✓ <packagename3> └> packages/<packagename3> Linking workspace packages... > SUCCESS Generating IntelliJ IDE files... > SUCCESS
解决方案建议
- 检查文件复制完整性:在容器内执行
ls -la packages/,确认所有子包的pubspec.yaml都已正确复制,排查是否因.dockerignore忽略必要文件或COPY命令遗漏文件。 - 修复文件权限:执行
chmod -R 644 packages/,确保容器内的pubspec.yaml文件具备可读权限,避免melos无法读取解析。 - 升级melos版本:当前使用的melos 2.9.0可能存在兼容性问题,尝试切换到稳定版本,如
dart pub global activate melos 3.0.0(或最新稳定版)。 - 校验路径大小写:容器使用Linux环境,路径区分大小写,确认本地路径命名(如
package/package1vspackages/package1)在容器内完全一致,避免路径匹配错误导致找不到pubspec文件。 - 提前解析依赖:在执行
melos bootstrap前,先在每个子包执行dart pub get,或在根目录执行dart pub get,确保依赖提前完成解析。 - 清理缓存:容器内执行
dart pub cache clean,重新激活melos后再执行bootstrap。
内容的提问来源于stack exchange,提问作者Guilherme Vieira
相关产品推荐
相关产品推荐

