Maintaining flutter projects and open source packages, keeping all source in dart format is important to let other collaborators to review your PRs with ease and passing flutter analyse for package. Since most of my projects are on GitHub and GitLab, free monthly GitHub Action and GitLab CI helped me a lot.
1. Local Pre-commit Hook
I have added a pre-commit hook to my flutter project which can ensure the source fits dart format before commit.
- open terminal goto
.git/hooks
and create a filepre-commit
. - run
chmod +x pre-commit
to make the file executable. - update the
pre-commit
file with following script. - a message will show and block the commit if the commit is not following dart format
#!/bin/sh
DARTFMT_OUTPUT=`dart format lib test | grep "0 changed"`
if [ -n "$DARTFMT_OUTPUT" ]; then
echo "[pre-commit] All Dart files are formatted."
echo "[pre-commit] $DARTFMT_OUTPUT"
exit 0
else
echo "[pre-commit] Files are changed, please verify and re-attempt commit"
echo "[pre-commit] $DARTFMT_OUTPUT"
exit 1
fi
2. Test Before Merge PR
Many platform provide custom CI action allow perform test before merging PR. For example, GitHub Action, GitLab CI and CodeMagic are able to conduct the format test. Depending on cost and platform using, no need to implement every platform. This move is to avoid the commits made by web portal causing incorrect format since some situations not every collaborators are developer.
GitHub Action
For project using GitHub, I will add a yaml file to .github/workflows/
. For example, this is my .github/workflows/dart-format.yaml
which will run once at pull request to avoid merging some reviews directly on web accidentally causing dart format incorrect.
name: Dart-Format
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
container:
image: google/dart:latest
steps:
- uses: actions/checkout@v2
- name: Print Dart SDK version
run: dart --version
- name: Verify formatting
run: dart format --output=show --set-exit-if-changed .
GitLab CI
Similarly, GitLab also can setup a file declare to do different action on different situation. I will create a .gitlab-ci.yml
in the project. The following file will run the dart format checking when I pushed something.
stages:
- test
dart-format-test:
image: cirrusci/flutter
stage: test
script:
- flutter format lib test --set-exit-if-changed
only:
- pushes
CodeMagic
I have put the bash script which is the same as the local one to the pre-test part. If the format is not correct, it will soon stop further action and notify me.