在Monorepo中统一管理Flutter SDK版本的正确方法
解决Monorepo中Flutter包字段配置与SDK版本统一问题
一、非依赖Flutter包指定特定字段
针对Rust Crate生成的Dart接口包(与其他Flutter包无依赖关系),可以通过以下两种方式统一配置特定字段:
1. 批量脚本修改pubspec.yaml
编写Dart脚本遍历Monorepo下所有目标包,批量注入或修改指定字段:
// sync_pubspec_fields.dart import 'dart:io'; import 'package:yaml/yaml.dart'; import 'package:yaml_edit/yaml_edit.dart'; void main() { // 读取根目录的共享配置文件 final rootConfig = loadYaml(File('pubspec_shared.yaml').readAsStringSync()); final packagesDir = Directory('packages'); if (!packagesDir.existsSync()) return; for (final dir in packagesDir.listSync().whereType<Directory>()) { final pubspecPath = '${dir.path}/pubspec.yaml'; if (!File(pubspecPath).existsSync()) continue; final yamlEditor = YamlEditor(File(pubspecPath).readAsStringSync()); // 同步统一的environment字段 if (rootConfig['environment'] != null) { yamlEditor.update(['environment'], rootConfig['environment']); } // 同步自定义字段(示例) if (rootConfig['custom_metadata'] != null) { yamlEditor.update(['custom_metadata'], rootConfig['custom_metadata']); } File(pubspecPath).writeAsStringSync(yamlEditor.toString()); print('Updated ${dir.path}/pubspec.yaml'); } }
在melos.yaml中添加执行命令:
scripts: sync-pubspec-fields: dart run sync_pubspec_fields.dart
执行melos run sync-pubspec-fields即可完成批量同步。
2. Rust构建阶段注入字段
若Dart接口包由Rust Crate生成,可在Rust的build.rs中读取根目录配置,生成pubspec.yaml时直接注入统一字段:
// build.rs use std::fs; use yaml_rust::YamlLoader; fn main() { let shared_config = fs::read_to_string("../pubspec_shared.yaml").unwrap(); let yaml = YamlLoader::load_from_str(&shared_config).unwrap()[0].clone(); let pubspec_content = format!( "name: {} version: 0.1.0 environment: sdk: '{}' flutter: '{}' dependencies: flutter: sdk: flutter ", env!("CARGO_PKG_NAME"), yaml["environment"]["sdk"].as_str().unwrap(), yaml["environment"]["flutter"].as_str().unwrap() ); fs::write("pubspec.yaml", pubspec_content).unwrap(); }
这样每次构建Rust Crate时,生成的Dart包pubspec会自动带上统一配置。
二、统一管理Flutter SDK版本
1. 根目录维护统一版本配置
在Monorepo根目录创建pubspec_shared.yaml,定义统一的SDK版本:
environment: sdk: '>=3.1.0 <4.0.0' flutter: '>=3.13.0'
结合上面的sync-pubspec-fields脚本,批量替换所有包的pubspec.yaml中的environment字段,实现版本统一。
2. Melos批量执行版本检查与依赖升级
在melos.yaml中添加脚本,批量操作所有包:
scripts: check-flutter-version: | melos exec -- flutter doctor --check-sdk-version upgrade-flutter-deps: | melos exec -- flutter pub upgrade
执行melos run check-flutter-version可快速排查版本不匹配的包,执行melos run upgrade-flutter-deps批量升级所有包的依赖。
3. 配合FVM统一SDK版本
在根目录创建.flutter-version文件,写入指定版本:
3.13.0
使用FVM(Flutter版本管理工具)统一所有包的SDK版本:
# 安装指定版本 fvm install # 批量让所有包使用该版本 melos exec -- fvm use
这样所有包都会使用FVM指定的Flutter版本,无需手动修改pubspec。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

