build_config 0.3.1+4

  • README.md
  • CHANGELOG.md
  • Installing
  • Versions
  • 87

Customizing builds

Customizing the build behavior of a package is done by creating a build.yaml file, which describes your configuration.

The full format is described in the docs/build_yaml_format.md file, while this documentation is more focused on specific usage scenarios of the file.

Dividing a package into Build targets

When a Builder should be applied to a subset of files in a package the package can be broken up into multiple 'targets'. Targets are configured in the targets section of the build.yaml. The key for each target makes up the name for that target. Targets can be referred to in '$definingPackageName:$targetname'. When the target name matches the package name it can also be referred to as just the package name. One target in every package must use the package name so that consumers will use it by default. In the build.yaml file this target can be defined with the key $default or with the name of the package.

Each target may also contain the following keys:

  • sources: List of Strings or Map, Optional. The set of files within the package which make up this target. Files are specified using glob syntax. If a List of Strings is used they are considered the 'include' globs. If a Map is used can only have the keys include and exclude. Any file which matches any glob in include and no globs in exclude is considered a source of the target. When include is omitted every file is considered a match.
  • dependencies: List of Strings, Optional. The targets that this target depends on. Strings in the format '$packageName:$targetName' to depend on a target within a package or $packageName to depend on a package's default target. By default this is all of the package names this package depends on (from the pubspec.yaml).
  • builders: Map, Optional. See "configuring builders" below.

Configuring Builders applied to your package

Each target can specify a builders key which configures the builders which are applied to that target. The value is a Map from builder to configuration for that builder. The key is in the format '$packageName|$builderName'. The configuration may have the following keys:

  • enabled: Boolean, Optional: Whether to apply the builder to this target. Omit this key if you want the default behavior based on the builder's auto_apply configuration. Builders which are manually applied (auto_apply: none) are only ever used when there is a target specifying the builder with enabled: True.
  • generate_for: List of String or Map, Optional:. The subset of files within the target's sources which should have this Builder applied. See sources configuration above for how to configure this.
  • options: Map, Optional: A free-form map which will be passed to the Builder as a BuilderOptions when it is constructed. Usage varies depending on the particular builder. Values in this map will override the default provided by builder authors. Values may also be overridden based on the build mode with dev_options or release_options.
  • dev_options: Map, Optional: A free-form map which will be passed to the Builder as a BuilderOptions when it is constructed. Usage varies depending on the particular builder. The values in this map override Builder defaults or non mode-specific options per-key when the build is done in dev mode.
  • release_options: Map, Optional: A free-form map which will be passed to the Builder as a BuilderOptions when it is constructed. Usage varies depending on the particular builder. The values in this map override Builder defaults or non mode-specific options when the build is done in release mode.

Configuring Builders globally

Target level builder options can be overridden globally across all packages with the global_options section. These options are applied after all Builder defaults and target level configuration, and before --define command line arguments.

  • options: Map, Optional: A free-form map which will be passed to the Builder as a BuilderOptions when it is constructed. Usage varies depending on the particular builder. Values in this map will override the default provided by builder authors or at the target level. Values may also be overridden based on the build mode with dev_options or release_options.
  • dev_options: Map, Optional: A free-form map which will be passed to the Builder as a BuilderOptions when it is constructed. Usage varies depending on the particular builder. The values in this map override all other values per-key when the build is done in dev mode.
  • release_options: Map, Optional: A free-form map which will be passed to the Builder as a BuilderOptions when it is constructed. Usage varies depending on the particular builder. The values in this map override all other values per-key when the build is done in release mode.

Defining Builders to apply to dependents (similar to transformers)

If users of your package need to apply some code generation to their package, then you can define Builders and have those applied to packages with a dependency on yours.

The key for a Builder will be normalized so that consumers of the builder can refer to it in '$definingPackageName|$builderName' format. If the builder name matches the package name it can also be referred to with just the package name.

Exposed Builders are configured in the builders section of the build.yaml. This is a map of builder names to configuration. Each builder config may contain the following keys:

  • import: Required. The import uri that should be used to import the library containing the Builder class. This should always be a package: uri.
  • builder_factories: A List<String> which contains the names of the top-level methods in the imported library which are a function fitting the typedef Builder factoryName(BuilderOptions options).
  • build_extensions: Required. A map from input extension to the list of output extensions that may be created for that input. This must match the merged buildExtensions maps from each Builder in builder_factories.
  • auto_apply: Optional. The packages which should have this builder automatically to applied. Defaults to 'none' The possibilities are:
    • "none": Never apply this Builder unless it is manually configured
    • "dependents": Apply this Builder to the package with a direct dependency on the package exposing the builder.
    • "all_packages": Apply this Builder to all packages in the transitive dependency graph.
    • "root_package": Apply this Builder only to the top-level package.
  • required_inputs: Optional, see adjusting builder ordering
  • runs_before: Optional, see adjusting builder ordering
  • applies_builders: Optional, list of Builder keys. Specifies that other builders should be run on any target which will run this Builder.
  • is_optional: Optional, boolean. Specifies whether a Builder can be run lazily, such that it won't execute until one of it's outputs is requested by a later Builder. This option should be rare. Defaults to False.
  • build_to: Optional. The location that generated assets should be output to. The possibilities are:
    • "source": Outputs go to the source tree next to their primary inputs.
    • "cache": Outputs go to a hidden build cache and won't be published. The default is "cache". If a Builder specifies that it outputs to "source" it will never run on any package other than the root - but does not necessarily need to use the "root_package" value for "auto_apply". If it would otherwise run on a non-root package it will be filtered out.
  • defaults: Optional: Default values to apply when a user does not specify the corresponding key in their builders section. May contain the following keys:
    • generate_for: A list of globs that this Builder should run on as a subset of the corresponding target, or a map with include and exclude lists of globs.
    • options: Arbitrary yaml map, provided as the config map in BuilderOptions to the BuilderFactory for this builder. Individual keys will be overridden by configuration provided in either dev_options or release_options based on the build mode, and then overridden by any user specified configuration.
    • dev_options: Arbitrary yaml map. Values will replace the defaults from options when the build is done in dev mode (the default mode).
    • release_options: Arbitrary yaml map. Values will replace the defaults from options when the build is done in release mode (with --release).

Example builders config:

builders:
  my_builder:
    import: "package:my_package/builder.dart"
    builder_factories: ["myBuilder"]
    build_extensions: {".dart": [".my_package.dart"]}
    auto_apply: dependents
    defaults:
      release_options:
        some_key: "Some value the users will want in release mode"

Defining PostProcessBuilders

PostProcessBuilders are configured similarly to normal Builders, but they have some different/missing options.

These builders can not be auto-applied on their own, and must always build to cache because their outputs are not declared ahead of time. To apply them a user will need to explicitly enable them on a target, or a Builder definition can add them to apply_builders.

Exposed PostProcessBuilders are configured in the post_process_builders section of the build.yaml. This is a map of builder names to configuration. Each post process builder config may contain the following keys:

  • import: Required. The import uri that should be used to import the library containing the Builder class. This should always be a package: uri.
  • builder_factory: A String which contains the name of the top-level method in the imported library which is a function fitting the typedef PostProcessBuilder factoryName(BuilderOptions options).
  • input_extensions: Required. A list of input extensions that will be processed. This must match the inputExtensions from the PostProcessBuilder returned by the builder_factory.
  • defaults: Optional: Default values to apply when a user does not specify the corresponding key in their builders section. May contain the following keys:
    • generate_for: A list of globs that this Builder should run on as a subset of the corresponding target, or a map with include and exclude lists of globs.

Example config with a normal builder which auto-applies a post_process_builder:

builders:
  # The regular builder config, creates `.tar.gz` files.
  regular_builder:
    import: "package:my_package/builder.dart"
    builder_factories: ["myBuilder"]
    build_extensions: {".dart": [".tar.gz"]}
    auto_apply: dependents
    apply_builders: ["|archive_extract_builder"]
post_process_builders:
  # The post process builder config, extracts `.tar.gz` files.
  extract_archive_builder:
    import: "package:my_package/extract_archive_builder.dart"
    builder_factory: "myExtractArchiveBuilder"
    input_extensions: [".tar.gz"]

Adjusting Builder Ordering

Both required_inputs and runs_before can be used to tweak the order that Builders run in on a given target. These work by indicating a given builder is a dependency of another. The resulting dependency graph must not have cycles and these options should be used rarely.

  • required_inputs: Optional, list of extensions, defaults to empty list. If a Builder must see every input with one or more file extensions they can be specified here and it will be guaranteed to run after any Builder which might produce an output of that type. For instance a compiler must run after any Builder which can produce .dart outputs or those libraries can't be compiled. A Builder may not specify that it requires an output that it also produces since this would be a self-cycle.
  • runs_before: Optional, list of Builder keys. If a Builder is producing outputs which are intended to be inputs to other Builders they may be specified here. This guarantees that the specified Builders will be ordered later than this one. This will not cause Builders to be applied if they would not otherwise run, it only affects ordering.

Publishing build.yaml files

build.yaml configuration should be published to pub with the package and checked in to source control. Whenever a package is published with a build.yaml it should mark a dependency on build_config to ensure that the package consuming the config has a compatible version. Breaking version changes which do not impact the configuration file format will be clearly marked in the changelog.

0.3.1+4

  • Support the latest package:json_annotation.

0.3.1+3

  • Support package:build version 1.x.x.

0.3.1+2

  • Support package:json_annotation v1.

0.3.1+1

  • Increased the upper bound for the sdk to <3.0.0.

0.3.1

  • Improve validation and errors when parsing build.yaml.
  • Add BuildConfig.globalOptions support.

0.3.0

  • Parsing of build.yaml files is now done with the json_serializable package and is Dart 2 compatible.

    • The error reporting will be a bit different, but generally should be better, and will include the yaml spans of the problem sections.

Breaking Changes

There are no changes to the build.yaml format, the following changes only affect the imperative apis of this package.

  • The Constructors for most of the build config classes other than BuildConfig itself now have to be ran inside a build config zone, which can be done using the runInBuildConfigZone function. This gives the context about what package is currently being parsed, as well as what the default dependencies should be for targets.
  • Many constructor signatures have changed, for the most part removing the package parameter (it is now read off the zone).

0.2.6+2

  • Restore error for missing default target.

0.2.6+1

  • Restore error for missing build extensions.

0.2.6

  • The target and build_extensions keys for builder definitions are now optional and should be omitted in most cases since they are currently unused.
  • Support options based on mode, add devOptions and releaseOptions on TargetBuilderConfig.
  • Support applying default options based on builder definitions, add option, devOptions, and releaseOptions to TargetBuilderConfigDefaults.
  • Ensure that defaults and generateFor fields are never null.
  • Add InputSet.anything to name the input sets that don't filter out any assets.

0.2.5

  • Added post_process_builders section to build.yaml. See README.md for more information.-dev
  • Adds support for $default as a dependency, i.e.:
targets:
  $default:
    ...
  foo:
    dependencies:
      - $default

0.2.4

  • Add support for runs_before in BuilderDefinition.

0.2.3

  • Expose key normalization methods publicly, these include:
    • normalizeBuilderKeyUsage
    • normalizeTargetKeyUsage

0.2.2+1

  • Expand support for package:build to include version 0.12.0.

0.2.2

  • Bug fix: Empty build.yaml files no longer fail to parse.
  • Allow $default as a target name to get he package name automatically filled in.

0.2.1

  • Change the default for BuilderDefinition.buildTo to BuildTo.cache. Builders which want to operate on the source tree will need to explicitly opt in. Allow this regardless of the value of autoApply and the build system will need to filter out the builders that can't run.
  • By default including any configuration for a Builder within a BuildTarget will enabled that builder.

0.2.0

  • Add build_to option to Builder configuration.
  • Add BuildConfig.fromBuildConfigDir for cases where the package name and dependencies are already known.
  • Add TargetBuilderConfig class to configure builders applied to specific targets.
  • Add TargetBuilderConfigDefaults class for Builder authors to provide default configuration.
  • Add InputSet and change sources and generate_for to use it.
  • Remove BuildTarget.isDefault and related config parsing. The default will be determined by the target which matches the package name.
  • Normalize Target and Builder names so they are scoped to the package they are defined in.

Breaking

  • Remove BuildConfigSet class. This was unused.
  • Hide Pubspec class. Construct BuildConfig instances with a package path rather than an already created Pubspec instance.

0.1.1

  • Add auto_apply option to Builder configuration.
  • Add required_inputs option to Builder configuration.
  • Add is_optional option to Builder configuration.

0.1.0

  • Initial release - pulled from package:dazel. Updated to support build_extensions instead of input_extension and output_extensions.

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  build_config: ^0.3.1+4

2. Install it

You can install packages from the command line:

with pub:


$ pub get

with Flutter:


$ flutter packages get

Alternatively, your editor might support pub get or flutter packages get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:build_config/build_config.dart';
  
Version Uploaded Documentation Archive
0.3.1+4 Oct 23, 2018 Go to the documentation of build_config 0.3.1+4 Download build_config 0.3.1+4 archive
0.3.1+3 Sep 25, 2018 Go to the documentation of build_config 0.3.1+3 Download build_config 0.3.1+3 archive
0.3.1+2 Jul 24, 2018 Go to the documentation of build_config 0.3.1+2 Download build_config 0.3.1+2 archive
0.3.1+1 Jul 16, 2018 Go to the documentation of build_config 0.3.1+1 Download build_config 0.3.1+1 archive
0.3.1 Jun 22, 2018 Go to the documentation of build_config 0.3.1 Download build_config 0.3.1 archive
0.3.0 Jun 5, 2018 Go to the documentation of build_config 0.3.0 Download build_config 0.3.0 archive
0.2.6+2 May 16, 2018 Go to the documentation of build_config 0.2.6+2 Download build_config 0.2.6+2 archive
0.2.6+1 Apr 6, 2018 Go to the documentation of build_config 0.2.6+1 Download build_config 0.2.6+1 archive
0.2.6 Apr 6, 2018 Go to the documentation of build_config 0.2.6 Download build_config 0.2.6 archive
0.2.5 Mar 13, 2018 Go to the documentation of build_config 0.2.5 Download build_config 0.2.5 archive

All 18 versions...

Popularity:
Describes how popular the package is relative to other packages. [more]
87
Health:
Code health derived from static analysis. [more]
100
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
70
Overall:
Weighted score of the above. [more]
87
Learn more about scoring.

We analyzed this package on Dec 5, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.1.0
  • pana: 0.12.7

Platforms

Detected platforms: Flutter, other

Primary library: package:build_config/build_config.dart with components: io, build.

Maintenance suggestions

The description is too short. (-20 points)

Add more detail about the package, what it does and what is its target use case. Try to write at least 60 characters.

Maintain an example. (-10 points)

Create a short demo in the example/ directory to show how to use this package. Common file name patterns include: main.dart, example.dart or you could also use build_config.dart.

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.0.0-dev.54 <3.0.0
build >=0.12.1 <2.0.0 1.0.1
json_annotation >=1.0.0 <3.0.0 2.0.0
meta ^1.1.0 1.1.6
path ^1.4.0 1.6.2
pubspec_parse ^0.1.0 0.1.2+3
yaml ^2.1.11 2.1.15
Transitive dependencies
analyzer 0.33.6 0.34.0
args 1.5.1
async 2.0.8
charcode 1.1.2
collection 1.14.11
convert 2.0.2
crypto 2.0.6
csslib 0.14.6
front_end 0.1.6+8 0.1.7
glob 1.1.7
html 0.13.3+3
kernel 0.3.6+8 0.3.7
logging 0.11.3+2
package_config 1.0.5
plugin 0.2.0+3
pub_semver 1.4.2
source_span 1.4.1
string_scanner 1.0.4
typed_data 1.1.6
utf 0.9.0+5
watcher 0.9.7+10
Dev dependencies
build_runner ^1.0.0
build_test ^0.10.0
build_vm_compilers ^0.1.0
json_serializable ^1.2.1
test ^1.0.0