如何获取原生Dart程序pubspec.yaml中的构建与版本号
原生Dart程序获取pubspec.yaml版本号与构建号的解决方案
由于dart2native编译生成的可执行文件不会携带原项目的pubspec.yaml文件,且Flutter生态的package_info_plus包不支持纯原生Dart场景,可采用以下两种无额外特殊依赖的方案实现:
- 方案1:编译时通过环境变量注入
该方式操作最简单,无需引入额外依赖包。
你可以在编译前通过脚本读取pubspec.yaml中的version字段,拆分出版本号(+号前的部分)和构建号(+号后的部分)后,通过dart compile的--define参数将两个值注入为编译时常量,业务代码中直接读取常量即可。
代码调用示例:
// 读取编译时注入的常量,缺省值可自行定义 const String appVersion = String.fromEnvironment('APP_VERSION', defaultValue: 'unknown'); const String appBuildNumber = String.fromEnvironment('APP_BUILD_NUMBER', defaultValue: '0');
Linux/macOS 环境编译脚本示例:
# 读取pubspec.yaml中的version字段值 FULL_VERSION=$(grep '^version: ' pubspec.yaml | awk '{print $2}') # 拆分出版本号和构建号 APP_VERSION=${FULL_VERSION%+*} APP_BUILD_NUMBER=${FULL_VERSION#*+} # 编译时注入参数,生成可执行文件 dart compile exe bin/你的项目入口文件.dart -o 输出的可执行文件名 \ --define=APP_VERSION=$APP_VERSION \ --define=APP_BUILD_NUMBER=$APP_BUILD_NUMBER
Windows PowerShell 环境可按照相同逻辑修改脚本语法即可。
- 方案2:构建时自动生成常量代码
如果不想手动维护编译脚本,可以使用Dart官方的build_runner工具,自定义简单的构建器,在预构建阶段自动读取pubspec.yaml的版本信息,生成一个包含对应常量的.dart文件,业务代码直接引用该文件的常量即可。该方案同样会把版本信息硬编码到最终的二进制文件中,运行时不需要依赖外部的pubspec.yaml文件。
两种方案都完全适配原生Dart场景,编译后的可执行文件可独立运行,无需携带任何原项目配置文件。
内容的提问来源于stack exchange,提问作者Guy Luz
相关产品推荐
相关产品推荐

