-
Notifications
You must be signed in to change notification settings - Fork 53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[native_assets_cli] Unify metadata and assets #1251
Comments
@bdero Just a heads up, we might break the metadata soon (or temporarily remove it until we find an API that we want to add to do this). As a workaround, you could try to build the compiler in |
I thought I had posted an API sketch here earlier, but apparently I didn't. My current way of thinking is: void addAsset(
Asset asset, {
Iterable<Uri>? dependencies,
bool forBuildHooks, // if true, not bundled, but available to build hooks that have this build hook as direct dependency
String? linkInPackage, // if set, not bundled directly but sent to specific link hook
}); This way we can properly track dependencies per asset no matter where these assets are wired to: |
We might not address this issue fully before stable. * #1251 But we're quite sure to remove the current metadata API, so deprecate it.
The API is starting to look a bit overloaded with arguments. I wonder if there is a way to simplify this. Maybe use asset types instead? This would make asset creation a bit more nested. class MetadataAsset {
final Asset asset;
}
class LinkableAsset {
final String targetPackage;
final Asset asset;
} @lrhn, as you like to simplify APIs :) |
Or maybe we should have a "Routing" (name tbd) param instead. That would also give us a place to document the behavior. addAsset(
Asset asset, {
Routing routing = const Routing.bundleInApp,
});
final class Routing {
/// This asset will be bundled in the app by the Dart or Flutter SDK.
static const Routing bundleInApp;
/// This asset is available in build hooks of which the packages have a
/// direct dependency on the package with this build hook.
static const Routing forBuildHooks;
/// The asset will not be bundled during the build step, but sent as input to
/// the link hook of the specified package, where it can be further processed
/// and possibly bundled.
factory Routing.linkInPackage(String packageName)
} |
Circling back on this issue after we have decided that:
Looking at the suggestion to reuse
Moving metadata to be inside files rather than structured data in the JSON would still have the benefit of better caching: if the metadata is not read, then the metadata file does not have to be added to dependencies, and the cache is not invalidated. However, I'm not entirely sure how often such invalidation would happen in practise. A build hook only sees the metadata from a direct dependency. And most direct dependencies will be published packages that only change if the dependencies are bumped in the pubspec (in which case the Dart source change and hooks are rerun). So it might be fine to just keep the current approach (encoding the metadata in json). If someone really has a super big meta data, they can always chose to encode a file-path in the That being said, due to the routing similarities between metadata (build hook to direct dependendee build hook) and assets for linking (build hook to specific link hook), it would still feel nice to unify the concepts/align APIs. (And most likely using files instead of arbitrary json fits better if we try to unify the APIs.) Non-satisfactory attempt: // build or link hook -> bundle in app
output.assets.code.add(
CodeAsset(...),
);
// build hook -> link hook
output.assets.code.add(
CodeAsset(...),
linkInPackage: 'foo',
);
// build hook -> build hook
output.assets.metadata.add(
MetaDataAsset(
key,
value,
),
); If we embrace just encoding in JSON, we probably should change the API to be more in line with how input.metadata[package]?[key];
output.metadata[key] = value;
output.metadata.addAll(...); For reference, current API: input.metadatum(package, key);
input.metadata(package);
output.addMetadatum(key, value);
output.addMetadata(Map<String, Object> metadata); |
We currently have 3 types of output of a build hook:
The most common use cases for metadata are:
Maybe there are other use cases but, we haven't come up with them yet.
If there's a use case for structured data, it might be fine to just put that structured data in a json file and make it a data asset.
Unifying these 3 types of assets would:
addAsset(...)
for assets for bundling andassetAsset(linkIn: 'some_package', ...)
for sending it to a link hook, andaddMetadata(...)
for sending info to another build hook.)Then we need to come up with some name for these 3 types of "buildables".
Thanks @mosuem @mkustermann @liamappelbe @HosseinYousefi for the input! And please leave any other thoughts and suggestions.
The text was updated successfully, but these errors were encountered: