如何以编程方式访问Flutter插件的pubspec.yaml文件?
解决Flutter插件中无法获取自身pubspec.yaml版本的问题
我太懂这个坑了!当你在开发Flutter插件时,满心欢喜用package_info_plus想拿到插件自己的版本号,结果返回的却是测试用示例App的版本信息,属实让人头大。
问题根源
package_info_plus这类工具的设计逻辑是读取当前运行的宿主应用的配置信息,而插件本身是作为依赖被引入到示例App(或其他宿主App)中的,所以它自然会读取宿主App的pubspec.yaml版本,而非插件自己的。
解决方案:预注入插件版本号
既然运行时没法直接读取插件的pubspec.yaml,我们可以在构建阶段把版本号提前注入到插件代码里,具体步骤如下:
1. 编写版本生成脚本
在插件根目录下创建一个scripts文件夹,新建generate_version.dart脚本,用来读取pubspec.yaml的版本并生成一个可引用的Dart文件:
import 'dart:io'; import 'package:yaml/yaml.dart'; void main() { // 读取插件根目录的pubspec.yaml final pubspecFile = File('pubspec.yaml'); final yamlContent = loadYaml(pubspecFile.readAsStringSync()); // 提取版本号(去掉后面的build号,比如1.0.0+1变成1.0.0) final version = yamlContent['version'].toString().split('+')[0]; // 生成版本常量文件 final versionOutputFile = File('lib/src/version.dart'); versionOutputFile.writeAsStringSync("const String pluginVersion = '$version';"); }
2. 配置脚本运行时机
在插件的pubspec.yaml中添加脚本命令,方便每次更新版本后快速生成:
scripts: generate_version: dart run scripts/generate_version.dart
之后每次修改插件版本号后,运行dart run generate_version就能自动更新版本文件。
3. 在插件代码中引用版本号
在插件的业务代码里直接导入生成的文件,就能拿到插件自身的版本了:
import 'src/version.dart'; void somePluginFunction() { print('当前插件版本:$pluginVersion'); }
原生端版本同步(可选)
如果你的插件需要在Android/iOS原生层使用版本号,也可以通过类似的方式读取pubspec.yaml:
- Android端:在插件的
android/build.gradle中添加逻辑:
def pubspec = new File(project.rootDir, '../pubspec.yaml') def yaml = new org.yaml.snakeyaml.Yaml().load(pubspec.text) def versionName = yaml['version'].split('\\+')[0] android { defaultConfig { versionName versionName // 其他配置 } }
- iOS端:在插件的
.podspec文件中配置:
pubspec = YAML.load_file(File.join(__dir__, '../pubspec.yaml')) s.version = pubspec['version'].split('+').first
这样不管是Dart层还是原生层,都能拿到插件自己的版本号啦!
内容的提问来源于stack exchange,提问作者Teodor Ciuraru
相关产品推荐
相关产品推荐

