- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在开发一个 Flutter 应用程序,并想编写一个构建脚本来将某种原始文件(CSV 格式)转换为格式化的 JSON 文件,以作为 Flutter Assets 包含在内。
通过使用像 json_serializable
和 jaguar_serializer
这样的库,我了解了 build_runner
,所以看起来我要编写自己的 Builder
并通过 build_runner
调用它是一种明智的方式。
由于有关编写我们自己的构建脚本的资源非常有限,我首先修改找到的示例 here .但是我在尝试更改输入和输出文件的路径时卡住了:当我运行 flutter pub pub run build_runner build
时,结果发现 Dart 仅在 [ project_dir]/web
目录,只允许我将文件写入此 web
目录。所以这段代码
buildStep.writeAsString(new AssetId(buildStep.inputId.package, 'assets/resources/foo.json'), '[]');
将产生以下异常:
UnexpectedOutputException: myapp|assets/resources/foo.json
Expected only: {myapp|web/.json}
[SEVERE] Failed after 24.4s
json_serializable
和 jaguar_serializer
可以在任何地方自由生成代码这一事实似乎表明我的配置存在问题。但是我在我的代码和 build.yaml
文件中的任何地方都找不到这个 web
东西,所以这真的很令人费解。
FWIW,这是我的 builder.yaml
文件的内容:
builders:
jsonBuilder:
import: "package:myapp/builder.dart"
builder_factories: ["jsonFileBuilder"]
build_extensions: {"source.csv": [".json"]}
build_to: source
auto_apply: root_package
这是 builder.dart
文件
import 'dart:async';
import 'package:build/build.dart';
Builder jsonFileBuilder(BuilderOptions options) => new JsonFileBuilder();
class JsonFileBuilder implements Builder {
@override
Future build(BuildStep buildStep) async {
await buildStep.writeAsString(
new AssetId(buildStep.inputId.package, 'assets/resources/foo.json'),
'hello');
}
@override
final buildExtensions = const {
'source.csv': const ['.json']
};
}
提前致谢!
最佳答案
好吧,看来这个问题实际上是双重的。
我的问题是,如果我将源 CSV 文件放在某个任意目录下(例如 offline
),我的构建脚本将不会运行,因为没有找到匹配的文件。但是当我将文件放在 web
下时(如示例中所示),脚本将被调用。这让我产生了文件扫描仅限于web/
的错觉。事实上,有一个列表 hard-coded file/directory whitelist :
const List<String> _defaultRootPackageWhitelist = const [
'benchmark/**',
'bin/**',
'example/**',
'lib/**',
'test/**',
'tool/**',
'web/**',
'pubspec.yaml',
'pubspec.lock',
];
如果我将 CSV 文件放在 lib/
下,我的构建脚本也会被调用。
要将我的非白名单文件附加到列表中,我必须将以下部分添加到 build.yaml
。
targets:
$default:
sources:
# Need to replicate the default whitelist here or other build will break:
- "benchmark/**"
- "bin/**"
- "example/**"
- "lib/**"
- "test/**"
- "tool/**"
- "web/**"
- "pubspec.yaml"
- "pubspec.lock"
# My new source
- "offline/source.csv"
我的问题是我无法写入任意目录,构建系统一直提示我只能写入web/
。所以我以为文件写入被锁定到web/
。同样,这也不完全正确,因为文件写入实际上锁定到输入文件的目录。这意味着我只能在构建运行器成功识别此目录中的文件后才能写入 offline/
。
文件写入权限的检查由this method in build_step_impl.dart
控制:
void _checkOutput(AssetId id) {
if (!_expectedOutputs.contains(id)) {
throw new UnexpectedOutputException(id, expected: _expectedOutputs);
}
}
此 _expectedOutputs
是我的构建器类的 buildExtensions
映射的扁平化值。所以如果我真的想写入 assets/resources/foo.json
我必须这样写:
@override
final buildExtensions = const {
'source.csv': const ['/../../assets/resources/foo.json']
};
必须对 build.yaml
进行类似的调整:
build_extensions: {".csv": ["/../../assets/resources/foo.json"]}
这基本上解决了我的大部分问题,但还有一些问题:
首先,我打算编写一个读取单个文件并写入多个文件的构建脚本。文件的数量及其文件名取决于源文件的内容。鉴于检查代码,这似乎不是受支持的功能。不是障碍物,但有点不方便。
第二个是关于输出文件路径。您可以看到我的源文件位于 [projectDir]/offline
中,我想写入 [projectDir]/assets
,但输出文件名显示为 /。 ./../assets/...
,向上两层。这是因为原始文件名(没有扩展名)被添加到输出路径之前,这就是为什么人们会在生成 Dart 代码的构建器配置中看到 .g.dart
的原因。我需要编写 /../../assets
这样我的文件的完整输出路径将变为 [projectDir]/offline/source/../../assets
使其解析为所需的输出文件路径。但是默认行为给我的印象是构建系统不希望我的脚本写入当前文件目录之外的任何地方,而我所做的是对系统的黑客攻击或滥用。
关于Dart build_runner 只能扫描/读取/写入web/目录下的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51188114/
我正在使用 EasyLocalization、mobx、JsonSerializable 等来生成 *.g.dart 文件,我正在使用 build_runner watch 或 scripts/bui
我与 Hive Packages 合作,我在我的项目中实现了模块化。 首先我创建名称为 network 的包使用运行命令 flutter create --template=package netwo
我写了一个 flutter 项目,它工作正常,我能够正确构建它,但是当我添加 retrofit_generator 时,构建失败了,如果我删除生成器,代码运行良好,构建也会成功。这是错误, 不支持的操
我正在为我的 flutter 项目使用 MobX,它需要 build_runner 来生成相关文件,现在我有一百个自动生成的文件,现在我想删除它们all, 什么命令可以从这些文件中学习我的项目? 我正
我正在为我的 flutter 项目使用 MobX,它需要 build_runner 来生成相关文件,现在我有一百个自动生成的文件,现在我想删除它们all, 什么命令可以从这些文件中学习我的项目? 我正
有没有办法忽略 JsonSerializable 类中属性的序列化? 我正在使用 build_runner 生成映射代码。 实现此目的的一种方法是在 .g.dart 文件中注释该特定属性的映射,但如果
我正在使用 build_runner 在 flutter 项目中生成自动生成的代码。 问题:当我在模型类中进行更新,然后我尝试在命令下运行时,它不会更新自动生成的类。 命令: pub run buil
我正在我的 flutter 应用程序中实现 auto_route 包。我在 app_router.dart 文件中添加了以下代码。 import 'package:auto_route/annotat
flutter 版本: flutter_macos_v1.9.1+hotfix.2-stable 在终端中创建新项目: flutter create myapp 打开vscode,编辑pubspec.
我正在尝试将我的 Flutter 项目升级到 Flutter2。我看到我所有的包都是 null 安全的,但是 bulid_runner。 $ flutter pub outdated --mode=n
我正在开发一个 Flutter 应用程序,并想编写一个构建脚本来将某种原始文件(CSV 格式)转换为格式化的 JSON 文件,以作为 Flutter Assets 包含在内。 通过使用像 json_s
有没有办法传递变量(比如 build.yaml 文件的路径,然后让构建器仅在单个文件/目录上运行? targets: $default: builders: freezed:
我在运行 flutter pub run build_runner build 时遇到了这个问题。我尝试过类似 flutter clean、flutter pub-cache repair、flutt
这是错误: Bad state: Unexpected diagnostics: C:\flutter\bin\cache\dart-sdk\lib\internal\internal.dart:17
我已添加 // @dart=2.9到我的所有文件,但 build_runner不会在不抛出此错误的情况下做它的事情: Warning: Operand of null-aware operation
我正在尝试使用cmd“flutter pub run build_runner build”从对象序列化JSON格式,但它始终显示以下消息: 运行JsonSerializableGenerator时出
我想加快 build_runner 所需的构建时间,并且我还想在编辑没有任何文件可生成的文件时运行 build watch 时防止重新构建. 我知道这需要在 build.yaml 文件中进行编辑,但我
我想加快 build_runner 所需的构建时间,并且我还想在编辑没有任何文件可生成的文件时运行 build watch 时防止重新构建. 我知道这需要在 build.yaml 文件中进行编辑,但我
我只是想用我 3 个月前存储的相同命令来生成我的文件(我对后端和 devops 不太擅长),现在它不再生成文件了。 它告诉我使用我不记得的删除命令,但即使使用该命令,我的文件仍然不会生成。 这就是我的
运行后flutter pub run build_runner watch --delete-conflicting-outputs构建运行器输出 $ flutter pub run build_ru
我是一名优秀的程序员,十分优秀!