Dart中my_package二进制资产加载与Git依赖共享方案问询
解决Dart包Git依赖时二进制文件加载失败的方案
1. 配置包的资产声明
先在my_package的pubspec.yaml里正确声明资产,确保引用项目能自动同步二进制文件:
# Flutter包配置 flutter: assets: - assets/your_binary.dll # 替换为实际文件名,支持通配符如`assets/*.dll` # 纯Dart包配置 assets: - assets/
注意:Git仓库要包含assets目录及二进制文件,别在.gitignore里排除这些文件。
2. 修正二进制加载逻辑
原来的路径判断只适配本地调试和Flutter发布包,没考虑依赖包场景。改用资源包API获取路径,再复制到临时目录(因为资产是只读的,DynamicLibrary需要可执行的文件系统路径):
Flutter环境加载代码
import 'dart:ffi'; import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; DynamicLibrary loadDll(String name) async { // 从包资产中读取二进制数据 final byteData = await rootBundle.load('packages/my_package/assets/$name'); // 创建临时文件存储二进制 final tempDir = await getTemporaryDirectory(); final tempPath = path.join(tempDir.path, name); final file = File(tempPath); if (!await file.exists()) { await file.writeAsBytes(byteData.buffer.asUint8List()); // Linux/macOS需要赋予执行权限 if (!Platform.isWindows) { await Process.run('chmod', ['+x', tempPath]); } } return DynamicLibrary.open(tempPath); }
纯Dart环境(含单元测试)加载代码
import 'dart:ffi'; import 'dart:io'; import 'package:path/path.dart' as path; import 'package:asset/asset.dart'; DynamicLibrary loadDll(String name) async { // 通过PackageAssetBundle获取包内资源 final bundle = PackageAssetBundle(); final byteData = await bundle.load('packages/my_package/assets/$name'); // 写入临时目录 final tempDir = Directory.systemTemp.createTempSync(); final tempPath = path.join(tempDir.path, name); final file = File(tempPath); if (!file.existsSync()) { file.writeAsBytesSync(byteData.buffer.asUint8List()); if (!Platform.isWindows) { Process.runSync('chmod', ['+x', tempPath]); } } return DynamicLibrary.open(tempPath); }
3. 单元测试适配
在my_package的单元测试中,要初始化资源绑定才能访问资产:
import 'package:flutter_test/flutter_test.dart'; import 'package:my_package/my_package.dart'; void main() { setUpAll(() { // 初始化Flutter测试环境的资源绑定 TestWidgetsFlutterBinding.ensureInitialized(); }); test('成功加载二进制文件', () async { final library = await loadDll('your_binary.dll'); expect(library, isNotNull); }); }
4. Git依赖引用注意事项
引用项目的pubspec.yaml中,正确配置Git依赖:
dependencies: my_package: git: url: https://github.com/你的用户名/my_package.git ref: main # 可选,指定分支、标签或提交哈希
核心说明
- 为什么要复制到临时目录:包内资产在引用项目中是打包状态,路径不直接对外暴露且只读,
DynamicLibrary.open需要可访问的文件系统路径,因此必须复制到临时目录。 - 跨平台兼容:Linux和macOS需要给二进制文件添加执行权限,Windows无需此操作。
内容的提问来源于stack exchange,提问作者George Gayton
相关产品推荐
相关产品推荐

