blob: 6a167ce250408d3593a1dc2c29a065cfe3e09b24 [file] [log] [blame] [view]
# Flutter Plugin Tools
This is a set of utilities used in the flutter/plugins and flutter/packages
repositories. It is no longer explictily maintained as a general-purpose tool
for multi-package repositories, so your mileage may vary if using it in other
repositories.
Note: The commands in tools are designed to run at the root of the repository or `<repository-root>/packages/`.
## Getting Started
In flutter/packages, the tool is run from source. In flutter/plugins, the
[published version](https://pub.dev/packages/flutter_plugin_tools) is used
instead.
The commands in tools require the Flutter-bundled version of Dart to be the first `dart` loaded in the path.
### Extra Setup
When updating sample code excerpts (`update-excerpts`) for the README.md files,
there is some [extra setup for
submodules](#update-readmemd-from-example-sources) that is necessary.
### From Source (flutter/packages only)
Set up:
```sh
cd ./script/tool && dart pub get && cd ../../
```
Run:
```sh
dart run ./script/tool/bin/flutter_plugin_tools.dart <args>
```
### Published Version
Set up:
```sh
dart pub global activate flutter_plugin_tools
```
Run:
```sh
dart pub global run flutter_plugin_tools <args>
```
## Commands
Run with `--help` for a full list of commands and arguments, but the
following shows a number of common commands being run for a specific package.
All examples assume running from source; see above for running the
published version instead.
Most commands take a `--packages` argument to control which package(s) the
command is targetting. An package name can be any of:
- The name of a package (e.g., `path_provider_android`).
- The name of a federated plugin (e.g., `path_provider`), in which case all
packages that make up that plugin will be targetted.
- A combination federated_plugin_name/package_name (e.g.,
`path_provider/path_provider` for the app-facing package).
### Format Code
```sh
cd <repository root>
dart run ./script/tool/bin/flutter_plugin_tools.dart format --packages package_name
```
### Run the Dart Static Analyzer
```sh
cd <repository root>
dart run ./script/tool/bin/flutter_plugin_tools.dart analyze --packages package_name
```
### Run Dart Unit Tests
```sh
cd <repository root>
dart run ./script/tool/bin/flutter_plugin_tools.dart test --packages package_name
```
### Run Dart Integration Tests
```sh
cd <repository root>
dart run ./script/tool/bin/flutter_plugin_tools.dart build-examples --apk --packages package_name
dart run ./script/tool/bin/flutter_plugin_tools.dart drive-examples --android --packages package_name
```
Replace `--apk`/`--android` with the platform you want to test against
(omit it to get a list of valid options).
### Run Native Tests
`native-test` takes one or more platform flags to run tests for. By default it
runs both unit tests and (on platforms that support it) integration tests, but
`--no-unit` or `--no-integration` can be used to run just one type.
Examples:
```sh
cd <repository root>
# Run just unit tests for iOS and Android:
dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --ios --android --no-integration --packages package_name
# Run all tests for macOS:
dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --macos --packages package_name
# Run all tests for Windows:
dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --windows --packages package_name
```
### Update README.md from Example Sources
`update-excerpts` requires sources that are in a submodule. If you didn't clone
with submodules, you will need to `git submodule update --init --recursive`
before running this command.
```sh
cd <repository root>
dart run ./script/tool/bin/flutter_plugin_tools.dart update-excerpts --packages package_name
```
### Update CHANGELOG and Version
`update-release-info` will automatically update the version and `CHANGELOG.md`
following standard repository style and practice. It can be used for
single-package updates to handle the details of getting the `CHANGELOG.md`
format correct, but is especially useful for bulk updates across multiple packages.
For instance, if you add a new analysis option that requires production
code changes across many packages:
```sh
cd <repository root>
dart run ./script/tool/bin/flutter_plugin_tools.dart update-release-info \
--version=minimal \
--changelog="Fixes violations of new analysis option some_new_option."
```
The `minimal` option for `--version` will skip unchanged packages, and treat
each changed package as either `bugfix` or `next` depending on the files that
have changed in that package, so it is often the best choice for a bulk change.
For cases where you know the change time, `minor` or `bugfix` will make the
corresponding version bump, or `next` will update only `CHANGELOG.md` without
changing the version.
### Publish a Release
**Releases are automated for `flutter/plugins` and `flutter/packages`.**
The manual procedure described here is _deprecated_, and should only be used when
the automated process fails. Please, read
[Releasing a Plugin or Package](https://github.com/flutter/flutter/wiki/Releasing-a-Plugin-or-Package)
on the Flutter Wiki first.
```sh
cd <path_to_repo>
git checkout <commit_hash_to_publish>
dart run ./script/tool/bin/flutter_plugin_tools.dart publish --packages <package>
```
By default the tool tries to push tags to the `upstream` remote, but some
additional settings can be configured. Run `dart run ./script/tool/bin/flutter_plugin_tools.dart
publish --help` for more usage information.
The tool wraps `pub publish` for pushing the package to pub, and then will
automatically use git to try to create and push tags. It has some additional
safety checking around `pub publish` too. By default `pub publish` publishes
_everything_, including untracked or uncommitted files in version control.
`publish` will first check the status of the local
directory and refuse to publish if there are any mismatched files with version
control present.
## Updating the Tool
For flutter/packages, just changing the source here is all that's needed.
For changes that are relevant to flutter/packages, you will also need to:
- Update the tool's pubspec.yaml and CHANGELOG
- Publish the tool
- Update the pinned version in
[flutter/packages](https://github.com/flutter/packages/blob/main/.cirrus.yml)