大型Flutter项目结合Git Submodules的实操疑问
子模块是否也必须是Flutter项目?
不需要。Git子模块本质是Git仓库的嵌套,你可以引入任何类型的Git仓库作为子模块,哪怕它只是纯Dart代码目录、资源文件集合,不需要是完整的Flutter项目结构。子模块是否需要单独的pubspec.yml?若需要,是否要确保其依赖版本与主项目一致?主项目与子模块使用同一包时该如何处理?
- 如果子模块是作为独立的Dart/Flutter模块被主项目通过路径依赖引用(比如主项目pubspec里写
path: ./submodules/xxx),那它必须有自己的pubspec.yml。 - 依赖版本建议尽量和主项目保持一致,否则容易出现依赖冲突(比如同一包不同版本导致编译失败)。如果出现版本不一致的情况,你可以在主项目的
pubspec.yml中使用dependency_overrides字段强制指定统一版本,覆盖子模块的依赖配置。 - 如果子模块只是单纯的代码目录,不被作为依赖包引用(直接在主项目代码里import子模块的文件),则不需要
pubspec.yml。
是否需要在每个模块单独执行flutter pub get?还是在主项目执行即可递归完成?
主项目执行flutter pub get只会处理自身的依赖,不会递归处理子模块的pubspec.yml。如果子模块有自己的pubspec.yml并需要拉取依赖,必须进入子模块目录单独执行flutter pub get或dart pub get;如果子模块没有pubspec.yml,则不需要执行任何pub命令。子模块必须遵循lib/main.dart这类标准结构吗?能否仅作为目录存在?能否移除lib/main.dart?
完全不需要遵循标准Flutter应用结构。子模块可以是任意目录结构,只要主项目能正确import其中的代码文件即可。它可以仅作为普通目录存在,甚至不需要lib目录;如果子模块不是独立应用,完全可以移除main.dart,只保留共享的代码文件。我的子模块仅存放多应用共享的通用代码,并非子应用,但Flutter项目本身属于应用类,是否会产生冲突?
不会产生冲突。只要子模块不作为独立应用运行,只是提供代码供主项目引用,主项目的应用结构和子模块的代码目录可以完美共存。你直接在主项目代码里import子模块中的文件即可,和引用本地目录代码的方式一致。我知晓Flutter Package方案,但更倾向于使用Git Submodules。
完全没问题,Git Submodules在多项目共享代码场景下有独特优势:比如可以直接在子模块中修改代码并提交,无需发布包;可以灵活切换子模块的分支、标签来控制版本。只要处理好依赖配置和代码引用的问题,完全可以替代Flutter Package满足你的需求。
内容的提问来源于stack exchange,提问作者Said Isa

