add builder script to compile protos into Dart
This commit is contained in:
parent
2fae07375c
commit
d1b7e960ee
3
mediapipe/dart/dart_builder/.gitignore
vendored
Normal file
3
mediapipe/dart/dart_builder/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
# https://dart.dev/guides/libraries/private-files
|
||||
# Created by `dart pub`
|
||||
.dart_tool/
|
3
mediapipe/dart/dart_builder/CHANGELOG.md
Normal file
3
mediapipe/dart/dart_builder/CHANGELOG.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
## 1.0.0
|
||||
|
||||
- Initial version.
|
2
mediapipe/dart/dart_builder/README.md
Normal file
2
mediapipe/dart/dart_builder/README.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
A sample command-line application with an entrypoint in `bin/`, library code
|
||||
in `lib/`, and example unit test in `test/`.
|
30
mediapipe/dart/dart_builder/analysis_options.yaml
Normal file
30
mediapipe/dart/dart_builder/analysis_options.yaml
Normal file
|
@ -0,0 +1,30 @@
|
|||
# This file configures the static analysis results for your project (errors,
|
||||
# warnings, and lints).
|
||||
#
|
||||
# This enables the 'recommended' set of lints from `package:lints`.
|
||||
# This set helps identify many issues that may lead to problems when running
|
||||
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
|
||||
# style and format.
|
||||
#
|
||||
# If you want a smaller set of lints you can change this to specify
|
||||
# 'package:lints/core.yaml'. These are just the most critical lints
|
||||
# (the recommended set includes the core lints).
|
||||
# The core lints are also what is used by pub.dev for scoring packages.
|
||||
|
||||
include: package:lints/recommended.yaml
|
||||
|
||||
# Uncomment the following section to specify additional rules.
|
||||
|
||||
# linter:
|
||||
# rules:
|
||||
# - camel_case_types
|
||||
|
||||
# analyzer:
|
||||
# exclude:
|
||||
# - path/to/excluded/files/**
|
||||
|
||||
# For more information about the core and recommended set of lints, see
|
||||
# https://dart.dev/go/core-lints
|
||||
|
||||
# For additional information about configuring this file, see
|
||||
# https://dart.dev/guides/language/analysis-options
|
26
mediapipe/dart/dart_builder/bin/dart_builder.dart
Normal file
26
mediapipe/dart/dart_builder/bin/dart_builder.dart
Normal file
|
@ -0,0 +1,26 @@
|
|||
import 'package:args/args.dart';
|
||||
import 'package:dart_builder/dart_builder.dart' as db;
|
||||
|
||||
final argParser = ArgParser()
|
||||
..addOption(
|
||||
'protoc',
|
||||
help: 'Override the path to protoc',
|
||||
)
|
||||
..addOption(
|
||||
'protobuf',
|
||||
help: 'Supply a path to google/protobuf if it is not '
|
||||
'next to google/mediapipe',
|
||||
)
|
||||
..addOption('output', abbr: 'o');
|
||||
|
||||
Future<void> main(List<String> arguments) async {
|
||||
final results = argParser.parse(arguments);
|
||||
final options = db.DartProtoBuilderOptions(
|
||||
protocPath: results['protoc'],
|
||||
protobufPath: results['protobuf'],
|
||||
outputPath: results['output'],
|
||||
);
|
||||
|
||||
final protoBuilder = db.DartProtoBuilder(options);
|
||||
await protoBuilder.run();
|
||||
}
|
108
mediapipe/dart/dart_builder/lib/commands.dart
Normal file
108
mediapipe/dart/dart_builder/lib/commands.dart
Normal file
|
@ -0,0 +1,108 @@
|
|||
import 'dart:io' as io;
|
||||
import 'package:io/ansi.dart' as ansi;
|
||||
|
||||
class Command {
|
||||
Command(
|
||||
this.arguments, {
|
||||
this.stdOutHandler,
|
||||
this.stdErrHandler,
|
||||
this.workingDirectory,
|
||||
bool? debug,
|
||||
}) : assert(arguments.isNotEmpty),
|
||||
_debug = debug ?? false;
|
||||
|
||||
final bool _debug;
|
||||
final String? workingDirectory;
|
||||
final List<String> arguments;
|
||||
void Function(String)? stdOutHandler;
|
||||
void Function(String)? stdErrHandler;
|
||||
|
||||
io.ProcessResult? _result;
|
||||
|
||||
/// Runs a command and scans its stdout contents for a given needle.
|
||||
/// If the needle is found, the command is considered to have completed
|
||||
/// successfully.
|
||||
factory Command.needleInOutput(
|
||||
List<String> arguments, {
|
||||
required String needle,
|
||||
List<String> ifMissing = const <String>[],
|
||||
bool shouldExitIfMissing = true,
|
||||
}) {
|
||||
return Command(
|
||||
arguments,
|
||||
stdOutHandler: (String output) {
|
||||
bool foundNeedle = false;
|
||||
bool contains(String line) => line.contains(needle);
|
||||
if (output.split('\n').any(contains)) {
|
||||
foundNeedle = true;
|
||||
}
|
||||
if (!foundNeedle) {
|
||||
for (String line in ifMissing) {
|
||||
io.stderr.writeln(ansi.wrapWith(line, [ansi.red]));
|
||||
}
|
||||
if (shouldExitIfMissing) {
|
||||
io.exit(1);
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
factory Command.which(
|
||||
String commandName, {
|
||||
String? documentationUrl,
|
||||
bool shouldExitIfMissing = true,
|
||||
}) {
|
||||
return Command(
|
||||
['which', commandName],
|
||||
stdOutHandler: (String output) {
|
||||
if (output.isEmpty) {
|
||||
io.stderr.writeAll([
|
||||
ansi.wrapWith(
|
||||
'$commandName not installed or not on path\n',
|
||||
[ansi.red],
|
||||
),
|
||||
if (documentationUrl != null)
|
||||
ansi.wrapWith(
|
||||
'Visit $documentationUrl for installation instructions\n',
|
||||
[ansi.red],
|
||||
),
|
||||
]);
|
||||
if (shouldExitIfMissing) {
|
||||
io.exit(1);
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
factory Command.run(
|
||||
List<String> command, {
|
||||
bool? debug,
|
||||
String? workingDirectory,
|
||||
}) =>
|
||||
Command(
|
||||
command,
|
||||
stdOutHandler: (String output) =>
|
||||
output.trim().isNotEmpty ? io.stdout.writeln(output.trim()) : null,
|
||||
stdErrHandler: (String output) =>
|
||||
output.trim().isNotEmpty ? io.stderr.writeln(output.trim()) : null,
|
||||
debug: debug,
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
|
||||
Future<void> run() async {
|
||||
if (_debug) {
|
||||
io.stdout.writeln('>>> ${arguments.join(' ')}');
|
||||
}
|
||||
_result = await io.Process.run(
|
||||
arguments.first,
|
||||
arguments.sublist(1),
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
stdOutHandler?.call(_result!.stdout);
|
||||
stdErrHandler?.call(_result!.stderr);
|
||||
}
|
||||
|
||||
int? get exitCode => _result?.exitCode;
|
||||
}
|
347
mediapipe/dart/dart_builder/lib/dart_builder.dart
Normal file
347
mediapipe/dart/dart_builder/lib/dart_builder.dart
Normal file
|
@ -0,0 +1,347 @@
|
|||
import 'dart:async';
|
||||
import 'dart:io' as io;
|
||||
import 'package:io/ansi.dart' as ansi;
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'commands.dart';
|
||||
|
||||
class DartProtoBuilder {
|
||||
DartProtoBuilder([this.options = const DartProtoBuilderOptions()])
|
||||
: repositoryRoot = io.Directory.current.parent.parent.parent {
|
||||
// Running this command from within bin (aka: `dart dart_builder.dart`)
|
||||
// throws everything off by one level. This merges that invocation style
|
||||
// with the expected, which is `dart bin/dart_builder.dart`.
|
||||
repositoryRoot = repositoryRoot.absolute.path
|
||||
.endsWith('mediapipe${io.Platform.pathSeparator}mediapipe')
|
||||
? repositoryRoot.parent
|
||||
: repositoryRoot;
|
||||
|
||||
// Assert we correctly calculated the repository root.
|
||||
if (!io.Directory(
|
||||
path.join(repositoryRoot.absolute.path, '.git'),
|
||||
).existsSync()) {
|
||||
io.stderr.writeAll(
|
||||
[
|
||||
'Executed dart_builder.dart from unexpected directory.\n',
|
||||
'Try running: `dart bin${io.Platform.pathSeparator}dart_builder.dart`\n'
|
||||
],
|
||||
);
|
||||
io.exit(1);
|
||||
}
|
||||
|
||||
_mediapipeDir = io.Directory(
|
||||
path.join(repositoryRoot.absolute.path, 'mediapipe'),
|
||||
);
|
||||
|
||||
_dartBuilderDirectory = io.Directory(
|
||||
path.join(
|
||||
repositoryRoot.absolute.path, 'mediapipe', 'dart', 'dart_builder'),
|
||||
);
|
||||
|
||||
_buildDirectory = io.Directory(
|
||||
path.join(
|
||||
io.Directory.current.parent.parent.parent.parent.absolute.path,
|
||||
'build',
|
||||
),
|
||||
);
|
||||
|
||||
_outputDirectory = options.outputPath != null
|
||||
? io.Directory(options.outputPath!)
|
||||
: io.Directory(
|
||||
path.join(
|
||||
repositoryRoot.absolute.path,
|
||||
'mediapipe',
|
||||
'dart',
|
||||
'mediapipe',
|
||||
'lib',
|
||||
'generated',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
final DartProtoBuilderOptions options;
|
||||
|
||||
io.Directory repositoryRoot;
|
||||
|
||||
// This is the `mediapipe` directory *within* the repository itself, which
|
||||
// is also named `mediapipe`
|
||||
io.Directory get mediapipeDir => _mediapipeDir!;
|
||||
io.Directory? _mediapipeDir;
|
||||
|
||||
io.Directory get buildDirectory => _buildDirectory!;
|
||||
io.Directory? _buildDirectory;
|
||||
|
||||
io.Directory get outputDirectory => _outputDirectory!;
|
||||
io.Directory? _outputDirectory;
|
||||
|
||||
io.Directory get dartBuilderDirectory => _dartBuilderDirectory!;
|
||||
io.Directory? _dartBuilderDirectory;
|
||||
|
||||
/// Location of local copy of git@github.com:protocolbuffers/protobuf.git.
|
||||
///
|
||||
/// This can either be passed in via `options`, or the script will check for
|
||||
/// the repository as a sibling to where `mediapipe` is checked out.
|
||||
///
|
||||
/// This starts out as `null` but is set by `_confirmProtobufDirectory`, which
|
||||
/// either successfully locates the repository or exits.
|
||||
io.Directory get protobufDirectory => _protobufDirectory!;
|
||||
io.Directory? _protobufDirectory;
|
||||
|
||||
final _protosToCompile = <io.File>[];
|
||||
|
||||
Future<void> run() async {
|
||||
await _confirmOutputDirectories();
|
||||
await _confirmProtocPlugin();
|
||||
await _confirmProtoc();
|
||||
await _confirmProtocGenDart();
|
||||
await _confirmProtobufDirectory();
|
||||
io.stdout.writeln(
|
||||
ansi.wrapWith(
|
||||
'Dependencies installed correctly.',
|
||||
[ansi.green],
|
||||
),
|
||||
);
|
||||
// await _buildProtos();
|
||||
await _buildBarrelFiles();
|
||||
}
|
||||
|
||||
Future<void> _buildProtos() async {
|
||||
await _prepareProtos();
|
||||
|
||||
await for (io.FileSystemEntity entity
|
||||
in mediapipeDir.list(recursive: true)) {
|
||||
if (entity is! io.File) continue;
|
||||
if (entity.path.endsWith('test.proto')) continue;
|
||||
if (entity.path.contains('tensorflow')) continue;
|
||||
if (entity.path.contains('testdata')) continue;
|
||||
if (entity.path.contains('examples')) continue;
|
||||
if (!entity.path.endsWith('.proto')) continue;
|
||||
_protosToCompile.add(entity);
|
||||
}
|
||||
|
||||
// Lastly, MediaPipe's protobufs have 1 dependency on the `Any` protobuf
|
||||
// from `google/protobuf`. Thus, for the whole thing to compile, we need to
|
||||
// add just that class.
|
||||
final outsideRepository = io.Directory(repositoryRoot.parent.absolute.path);
|
||||
final anyProto = io.File(
|
||||
path.join(
|
||||
outsideRepository.absolute.path,
|
||||
'protobuf',
|
||||
'src',
|
||||
'google',
|
||||
'protobuf',
|
||||
'any.proto',
|
||||
),
|
||||
);
|
||||
_protosToCompile.add(anyProto);
|
||||
_compileProtos(_protosToCompile);
|
||||
}
|
||||
|
||||
Future<void> _buildBarrelFiles() async {
|
||||
final generatedOutput = _GeneratedOutput();
|
||||
final fileSystemWalk = outputDirectory.list(recursive: true);
|
||||
|
||||
await for (io.FileSystemEntity entity in fileSystemWalk) {
|
||||
if (entity is io.Directory) {
|
||||
generatedOutput.add(entity);
|
||||
} else if (entity is io.File) {
|
||||
generatedOutput.addFile(entity.parent, entity);
|
||||
}
|
||||
}
|
||||
|
||||
int numBarrelFilesGenerated = 0;
|
||||
final sep = io.Platform.pathSeparator;
|
||||
for (final gen in generatedOutput.getDirectories()) {
|
||||
final fileExports = StringBuffer();
|
||||
final nestedBarrelExports = StringBuffer();
|
||||
|
||||
for (final dir in gen.directories) {
|
||||
final dirName = dir.absolute.path.split(sep).last;
|
||||
nestedBarrelExports.writeln("export '$dirName/$dirName.dart';");
|
||||
}
|
||||
|
||||
for (final file in gen.files) {
|
||||
final fileName = file.absolute.path.split(sep).last;
|
||||
|
||||
if (!fileName.endsWith('.dart')) continue;
|
||||
|
||||
// The top-level mediapipe.dart barrel file surfaces multiple collisions
|
||||
// from classes that exist in various libraries and then again within
|
||||
// `tasks`. To avoid these collisions, we skip generating the top-level
|
||||
// barrel file.
|
||||
if (fileName == 'mediapipe.dart') continue;
|
||||
|
||||
// Skip barrel files generated from a previous run
|
||||
final parentFolderName = file.parent.absolute.path.split(sep).last;
|
||||
if (fileName.split('.').first == parentFolderName) continue;
|
||||
|
||||
// Finally, add the valid file export
|
||||
fileExports.writeln("export '$fileName';");
|
||||
}
|
||||
|
||||
final hostDirName = gen.dir.absolute.path.split(sep).last;
|
||||
final barrelFile = io.File(
|
||||
'${gen.dir.absolute.path}$sep$hostDirName.dart',
|
||||
);
|
||||
// Delete a pre-existing barrel file.
|
||||
if (barrelFile.existsSync()) {
|
||||
io.File(barrelFile.absolute.path).deleteSync();
|
||||
}
|
||||
// Write to our new file.
|
||||
final spacingNewline = nestedBarrelExports.isNotEmpty ? '\n' : '';
|
||||
barrelFile.writeAsStringSync(
|
||||
'${nestedBarrelExports.toString()}$spacingNewline${fileExports.toString()}\n',
|
||||
);
|
||||
numBarrelFilesGenerated++;
|
||||
}
|
||||
io.stdout.writeln(
|
||||
ansi.wrapWith(
|
||||
'Generated $numBarrelFilesGenerated barrel files successfully.',
|
||||
[ansi.green],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
String get protocPath => options.protocPath ?? 'protoc';
|
||||
|
||||
/// Builds a single protobuf definition's Dart file.
|
||||
Future<void> _compileProtos(List<io.File> protoFiles) async {
|
||||
final command = Command.run(
|
||||
[
|
||||
protocPath,
|
||||
'-I${repositoryRoot.absolute.path}',
|
||||
'-I$_protobufCompilationImportPath',
|
||||
'--dart_out=grpc:${outputDirectory.absolute.path}',
|
||||
...protoFiles.map<String>((entity) => entity.absolute.path),
|
||||
],
|
||||
workingDirectory: dartBuilderDirectory.absolute.path,
|
||||
debug: true,
|
||||
);
|
||||
await command.run();
|
||||
if (command.exitCode! != 0) {
|
||||
io.stderr.writeln('Exiting with ${command.exitCode}');
|
||||
io.exit(command.exitCode!);
|
||||
}
|
||||
}
|
||||
|
||||
String get _protobufCompilationImportPath => io.Directory(
|
||||
path.join(protobufDirectory.absolute.path, 'src'),
|
||||
).absolute.path;
|
||||
|
||||
Future<void> _confirmOutputDirectories() async {
|
||||
if (!await _buildDirectory!.exists()) {
|
||||
_buildDirectory!.create();
|
||||
}
|
||||
if (!await _outputDirectory!.exists()) {
|
||||
_outputDirectory!.create();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _prepareProtos() async {
|
||||
if (!(await outputDirectory.exists())) {
|
||||
io.stdout.writeln('Creating output directory');
|
||||
outputDirectory.create();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _confirmProtoc() async => //
|
||||
Command.which(
|
||||
protocPath,
|
||||
documentationUrl:
|
||||
'http://google.github.io/proto-lens/installing-protoc.html',
|
||||
).run();
|
||||
|
||||
Future<void> _confirmProtocGenDart() async => //
|
||||
Command.which(
|
||||
'protoc-gen-dart',
|
||||
documentationUrl:
|
||||
'http://google.github.io/proto-lens/installing-protoc.html',
|
||||
).run();
|
||||
|
||||
Future<void> _confirmProtobufDirectory() async {
|
||||
_protobufDirectory = options.protobufPath != null
|
||||
? io.Directory(options.protobufPath!)
|
||||
: io.Directory(
|
||||
path.join(repositoryRoot.parent.absolute.path, 'protobuf'),
|
||||
);
|
||||
if (!await _protobufDirectory!.exists()) {
|
||||
io.stderr.writeAll(
|
||||
[
|
||||
'Could not find google/protobuf repository. You can clone this from ',
|
||||
'https://github.com/protocolbuffers/protobuf and either pass its '
|
||||
'location via the `--protobuf` flag, or by default, clone it in the '
|
||||
'same directory where you cloned `google/mediapipe`.\n'
|
||||
'\n',
|
||||
'Checked for protobuf library at ${_protobufDirectory!.absolute.path}\n',
|
||||
],
|
||||
);
|
||||
io.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _confirmProtocPlugin() async =>
|
||||
Command.needleInOutput(['dart', 'pub', 'global', 'list'],
|
||||
needle: 'protoc_plugin',
|
||||
ifMissing: [
|
||||
'protoc_plugin does not seem to be installed',
|
||||
'Run `dart pub global activate protoc_plugin` to install it',
|
||||
]).run();
|
||||
}
|
||||
|
||||
class DartProtoBuilderOptions {
|
||||
const DartProtoBuilderOptions({
|
||||
this.protocPath,
|
||||
this.protobufPath,
|
||||
this.outputPath,
|
||||
});
|
||||
|
||||
/// Location of `protoc`. Defaults to whatever is found on $PATH.
|
||||
final String? protocPath;
|
||||
|
||||
/// Location of local copy of git@github.com:protocolbuffers/protobuf.git
|
||||
final String? protobufPath;
|
||||
|
||||
/// Place to put the generated protobufs.
|
||||
final String? outputPath;
|
||||
}
|
||||
|
||||
/// Bundles a set of _GeneratedOutputDirectory objects with helpful getters.
|
||||
class _GeneratedOutput {
|
||||
final Map<String, _GeneratedOutputDirectory> generated = {};
|
||||
|
||||
void add(io.Directory dir) {
|
||||
generated[dir.absolute.path] = _GeneratedOutputDirectory(dir);
|
||||
if (contains(dir.parent)) {
|
||||
generated[dir.parent.absolute.path]!.addChild(dir);
|
||||
}
|
||||
}
|
||||
|
||||
bool contains(io.Directory dir) => generated.containsKey(dir.absolute.path);
|
||||
|
||||
_GeneratedOutputDirectory get(io.Directory dir) {
|
||||
if (!contains(dir)) {
|
||||
throw Exception('Unexpectedly asked for unknown directory: '
|
||||
'${dir.absolute.path}. Are you recursively walking the file system?');
|
||||
}
|
||||
return generated[dir.absolute.path]!;
|
||||
}
|
||||
|
||||
void addFile(io.Directory dir, io.File file) => get(dir).addFile(file);
|
||||
|
||||
Iterable<_GeneratedOutputDirectory> getDirectories() sync* {
|
||||
for (final gen in generated.values) {
|
||||
yield gen;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Tracks which Dart files were generated where for the purposes of adding
|
||||
/// barrel files.
|
||||
class _GeneratedOutputDirectory {
|
||||
_GeneratedOutputDirectory(this.dir);
|
||||
final io.Directory dir;
|
||||
final List<io.Directory> directories = [];
|
||||
final List<io.File> files = [];
|
||||
|
||||
void addChild(io.Directory dir) => directories.add(dir);
|
||||
void addFile(io.File file) => files.add(file);
|
||||
}
|
413
mediapipe/dart/dart_builder/pubspec.lock
Normal file
413
mediapipe/dart/dart_builder/pubspec.lock
Normal file
|
@ -0,0 +1,413 @@
|
|||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
_fe_analyzer_shared:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: "0816708f5fbcacca324d811297153fe3c8e047beb5c6752e12292d2974c17045"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "62.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: "21862995c9932cd082f89d72ae5f5e2c110d1a0204ad06e4ebaee8307b76b834"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.0"
|
||||
ansi:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: ansi
|
||||
sha256: ce4857dd957e8e4fcf1c2f409baa5b262a717a6516085d97532621c47ff87c6e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.2"
|
||||
ansi_codes:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ansi_codes
|
||||
sha256: "48aec9524e26ef234b0376b6bcf92edd9b89ad9c8994ddc7c3b52729af553bed"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.1"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.11.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.17.2"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
coverage:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: coverage
|
||||
sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.6.3"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
dart_internal:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_internal
|
||||
sha256: dae3976f383beddcfcd07ad5291a422df2c8c0a8a03c52cda63ac7b4f26e0f4e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.8"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: frontend_server_client
|
||||
sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: glob
|
||||
sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_multi_server
|
||||
sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
io:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: io
|
||||
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.7"
|
||||
lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: lints
|
||||
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.16"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
node_preamble:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: node_preamble
|
||||
sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_config
|
||||
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.3"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pool
|
||||
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.1"
|
||||
protobuf:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: protobuf
|
||||
sha256: "4034a02b7e231e7e60bff30a8ac13a7347abfdac0798595fae0b90a3f0afe759"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pub_semver
|
||||
sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf
|
||||
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
shelf_packages_handler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_packages_handler
|
||||
sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
shelf_static:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_static
|
||||
sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
shelf_web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_web_socket
|
||||
sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
source_map_stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_map_stack_trace
|
||||
sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
source_maps:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_maps
|
||||
sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.10.12"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.11.1"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
test:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: test
|
||||
sha256: "67ec5684c7a19b2aba91d2831f3d305a6fd8e1504629c5818f8d64478abf4f38"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.24.4"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.1"
|
||||
test_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_core
|
||||
sha256: "6b753899253c38ca0523bb0eccff3934ec83d011705dae717c61ecf209e333c9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.4"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.2"
|
||||
vm_service:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: b8c67f5fa3897b122cf60fe9ff314f7b0ef71eab25c5f8b771480bc338f48823
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "11.7.2"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket_channel
|
||||
sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
webkit_inspection_protocol:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webkit_inspection_protocol
|
||||
sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=3.1.0-149.0.dev <3.2.0"
|
20
mediapipe/dart/dart_builder/pubspec.yaml
Normal file
20
mediapipe/dart/dart_builder/pubspec.yaml
Normal file
|
@ -0,0 +1,20 @@
|
|||
name: dart_builder
|
||||
description: A sample command-line application.
|
||||
version: 1.0.0
|
||||
# repository: https://github.com/my_org/my_repo
|
||||
environment:
|
||||
sdk: ^3.1.0-149.0.dev
|
||||
|
||||
# Add regular dependencies here.
|
||||
dependencies:
|
||||
ansi: ^0.2.2
|
||||
args: ^2.4.2
|
||||
ffi: ^2.0.2
|
||||
fixnum: ^1.1.0
|
||||
io: ^1.0.4
|
||||
path: ^1.8.3
|
||||
protobuf: ^3.0.0
|
||||
|
||||
dev_dependencies:
|
||||
lints: ^2.0.0
|
||||
test: ^1.21.0
|
Loading…
Reference in New Issue
Block a user