You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:34:59