Flutter/Dart/Pub:有没有一种方法可以在运行构建时下载外部大型二进制依赖项?

cwtwac6a  于 2023-05-19  发布在  Flutter
关注(0)|答案(1)|浏览(106)

bounty还有3天到期。回答此问题可获得+50声望奖励。greyhairredbear希望引起更多关注这个问题。

在我的公司,我们开发了一个利用OpenCV进行边缘检测的库。由于一个有问题的决定,我们目前在库存储库中直接拥有大型OpenCV二进制文件(一个> 100 MB,另一个> 400 MB)。
当在flutter项目中包含库时,我们通常会引用库存储库中的标记。这已经为我们工作了一段时间了。
然而,我们现在已经逐渐将项目迁移到GitHub,并且我们遇到了一个问题,即GitHub仅在使用git LFS时才允许超过100 MB的大型二进制文件。我知道有一个effort to add support for git LFS to pub,但看起来这个功能不会很快完成。
所以我的问题是在dart的“构建过程”中,有没有一种方法可以从自定义位置下载大文件(在我们的例子中,就是获取依赖项并运行构建工具来生成代码)?或者你有其他的建议,例如。围绕构建编写自定义脚本?
我们的目标是为dart包/库只指定一次这些步骤,并简单地引用pubspec.yaml中的lib,这样我们就不必在所有库使用者中重复加载外部依赖项的代码了。

2nc8po8w

2nc8po8w1#

如果你想在Dart中保留Process类,你可以使用dart:io中Process类的run()方法。它使您能够运行cli命令,以便您可以为构建过程编写自己的脚本。在文档中,示例代码是这样写的:

var result = await Process.run('grep', ['-i', 'main', 'test.dart']);
stdout.write(result.stdout);
stderr.write(result.stderr);

而不是“grep”,您需要逐个指定您的构建过程。首先,您需要获得所需的依赖项,以便您可以编写类似“curl”的命令或在Dart中使用任何http客户端。一旦你下载了dependies,你可以运行这样的东西:

var result = await Process.run('dart', ['compile', 'exe', 'bin/app.dart']);

您只需要编写一个基本的dart程序,定义构建步骤,并在无法访问服务器时进行基本的错误处理。我会在lib文件夹中创建一个名为“static_dependecies”的文件夹,以便阅读代码的人可以了解情况。
工艺类文档:https://api.dart.dev/stable/2.19.6/dart-io/Process-class.html
如果你不想使用Dart,因为这些步骤是相同的,只需在bash或bat中实现它。我建议使用Dart并在最坏的情况下编译你的构建脚本。

相关问题