grinder 0.8.3+1

Grinder #

Dart workflows, automated.

Grinder consists of a library to define project tasks (e.g. test, build, doc) and a command-line tool to run them.

pub package Build Status Build status Coverage Status

Getting Started #

To start using grinder, add it to your dev_dependencies.

Defining Tasks #

Tasks are defined entirely by Dart code allowing you to take advantage of the whole Dart ecosystem to write and debug them. Task definitions reside in a tool/grind.dart script. To create a simple grinder script, run:

pub run grinder:init

In general, grinder scripts look something like this:

import 'package:grinder/grinder.dart';

main(args) => grind(args);

@DefaultTask('Build the project.')
build() {

@Task('Test stuff.')
test() {
  new PubApp.local('test').run([]);

@Task('Generate docs.')
doc() {
  log("Generating docs...");

@Task('Deploy built app.')
@Depends(build, test, doc)
deploy() {

Any task dependencies (see @Depends above), are run before the dependent task.

Grinder contains a variety of convenience APIs for common task definitions, such as PubApp referenced above. See the API Documentation for full details.

Running Tasks #

First install the grind executable:

pub global activate grinder

then use it to run desired tasks:

grind test
grind build doc

or to run a default task (see @DefaultTask above):


or to display a list of available tasks and their dependencies:

grind -h

You can also bypass installing grind and instead use pub run grinder.

Passing parameters to tasks #

In order to pass parameters to tasks from the command-line, you query the TaskArgs instance for your task invocation. For example:

grind build --release --mode=topaz


build() {
  TaskArgs args = context.invocation.arguments
  bool isRelease = args.getFlag('release');
  String mode = args.getOption('mode'); // will be set to topaz

would pass the flag release and the option mode to the build task.

You can pass flags and options to multiple tasks. The following command-line would pass separate flags and options to two different tasks:

grind build --release generate-docs --header=small

Disclaimer #

This is not an official Google product.

grinder.dart changes #

0.8.3+1 #

  • Mark fail() and as @alwaysThrows.
  • Use package:pedantic to analyze the package.

0.8.3 #

  • Upgrade dependencies for Dart 2

0.8.2 #

  • Address some --preview-dart-2 runtime issues.

0.8.1 #

  • Added the ability to pass parameters to tasks from the command line (using a TaskArgs parameter on task functions)
  • Removed the older way to pass flags and options to tasks (via named and positional parameters on task functions)
  • Remove a dependency on a non-strong mode package (unscripted)

0.8.0+3 #

  • All APIs, including pub run grinder, always use the same Dart version as the user.

0.8.0+2 #

  • Added categories and extraArgs parameters to Dart2Js.compile() and Dart2Js.compileAsync()

0.8.0+1 (2015/11/12) #

  • Fixed a bug with the DDC --html-report option

0.8.0 (2015/10/29) #

  • Removed deprecated constants: BIN_DIR, BUILD_DIR, LIB_DIR, WEB_DIR
  • Removed the 120-col line wrapping on task output
  • Added a task for DDC (dev_compiler)
  • Fixed an issue where we were emitting overly verbose stack traces on failures
  • Fixed an issue where we would emit stdout after a failure, even when the stdout had been emitted as part of the task
  • Added outFile and enableExperimentalMirrors to the dart2js task
  • Some grinder output now written using ansi colors
  • Removed the deprecated defaultInit method.
  • Added a task for dartdoc
  • Added a new sdkBin() method

0.7.2 (2015/7/8) #

  • Auto-expand directories passed to Analyzer.analyze() to a list of Dart source files using the added method findDartSourceFiles().
  • Add tests for Analyzer.analyze() task.
  • Add sourceDirs and existingSourceDirs to return the projects top-level directories usually containing Dart source files.
  • Deprecate the Tests class (in favor of TestRunner)
  • Add lineLength as an optional argument to DartFmt.format

0.7.1+3 (2015/5/24) #

  • Fix bug with Args were swapped.

0.7.1+2 (2015/5/24) #

  • Add a Dart.runAsync static method.

0.7.1+1 (2015/5/19) #

  • Add a files param to TestRunner.test.

0.7.1 (2015/5/19) #

  • Added grind --completion install command to install tab-completion for task names and options in grind.
  • Improved grind -h (help) output.
  • now takes an optional vmArgs, a list of arguments passed to the Dart VM.
  • Added downgrade method do Pub.
  • Introduce RunOptions to support all parameters. The workingDirectory parameter is now deprecated in all methods, use RunOptions.workingDirectory instead.
  • Added PubApp.runAsync.
  • In, deprecate the vmNewGenHeapMB and vmOldGenHeapMB options.
  • Added support for passing lists of files or directories to DartFmt.format().
  • Analyzer.analyzeFiles is deprecated in favor of Analyzer.analyze.
  • Added a method to list the installed applications.
  • added a TestRunner class - a wrapper around the new test package.

0.7.0 (2015/4/20) #

  • Big changes! Task definitions are now primarily annotation based; see the readme for more information and an example
  • The GrinderContext arg is no longer expected in task functions. Instead, the context variable (and the log and fail functions) are available as global variables. They're injected into the zone running the current task.
  • pub [global] run grinder:grind no longer work, use pub [global] run grinder instead. Add :grinder if using pub run in Dart SDK < 1.10.
  • copyFile and copyDirectory and deprecated in favor of a new copy method
  • deleteEntity is deprecated in favor of a new delete method
  • Renamed runProcess/runProcessAsync/runDartScript to run/runAsync/ Process result info (stdout, stderr, exitCode) is now exposed by these methods and some others which call them.
  • Added a wrapper class around pub global activate/run/pub run applications - PubApp
  • Grinder can now create a simple starter script for a project - run pub run grinder:init

0.6.5 (2015/1/13) #

  • added defaultInit() and defaultClean() methods, for common tasks
  • added methods for and
  • added an optional workingDirectory argument to more methods
  • added a --version command line flag
  • have the version command check to see if there's a newer version of grinder available
  • the dart2js compile tasks now create the output directory if it doesn't exist

0.6.4 (2014/12/18) #

  • clarify that users should put their build scripts in tools/grind.dart
  • add a getSdkDir method

0.6.2 (2014/11/13) #

  • widen the version constraint on quiver

0.6.1 (2014/10/12) #

  • widen the version constraint on args

0.6.0 (2014/09/22) #

The convenience API is now more terse:

  • the defineTask() method has been renamed to task()
  • instead of named parameters, the task() function now uses optional positional parameters

Added two new entrypoint files in bin/: grind.dart and grinder.dart. These let you run grinder via:

pub run grinder test

They look for a corresponding grinder script in the tool directory (bin/grind.dart looks for tool/grind.dart and bin/grinder.dart looks for tool/grinder.dart). If they find a corresponding script they run it in a new Dart VM process. This means that projects will no longer have to have a script in the root of each project.

PubTool's build methods now take an optional workingDirectory argument.

Removed runSdkBinary and runSdkBinaryAsync, and they are no longer needed. Use runProcess and runProcessAsync instead.

The methods on PubTools and Dart2jsTools are now static - you no longer need to create an instance to use them. Also, PubTools was renamed to Pub and Dart2jsTools was renamed to Dart2js. And a new utility class for dartanalyzer - Analyzer - was created.

0.5.7 (2014/07/28) #

  • added runProcessAsync() and related async methods (such as PubTools.buildAsync(...))
  • removed duplicated stack traces when the build fails with exceptions
  • throw an exception when running SDK binaries, and we are not able to locate the Dart SDK

Use this package as an executable

1. Install it

You can install the package from the command line:

$ pub global activate grinder

2. Use it

The package has the following executables:

$ grind

Use this package as a library

1. Depend on it

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

  grinder: ^0.8.3+1

2. Install it

You can install packages from the command line:

with pub:

$ pub get

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

3. Import it

Now in your Dart code, you can use:

import 'package:grinder/grinder.dart';
Describes how popular the package is relative to other packages. [more]
Code health derived from static analysis. [more]
Reflects how tidy and up-to-date the package is. [more]
Weighted score of the above. [more]
Learn more about scoring.

We analyzed this package on Feb 13, 2020, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.7.1
  • pana: 0.13.5

Health suggestions

Fix lib/grinder_files.dart. (-10.44 points)

Analysis of lib/grinder_files.dart reported 22 hints, including:

line 31 col 43: Unnecessary new keyword.

line 61 col 21: Unnecessary new keyword.

line 102 col 12: Unnecessary new keyword.

line 105 col 34: Unnecessary new keyword.

line 127 col 14: Unnecessary new keyword.

Fix lib/src/grinder.dart. (-9.99 points)

Analysis of lib/src/grinder.dart reported 21 hints, including:

line 33 col 42: Unnecessary new keyword.

line 35 col 15: Unnecessary new keyword.

line 48 col 13: Unnecessary new keyword.

line 83 col 15: Unnecessary new keyword.

line 105 col 13: Unnecessary new keyword.

Fix lib/grinder_sdk.dart. (-8.17 points)

Analysis of lib/grinder_sdk.dart reported 17 hints, including:

line 26 col 17: Unnecessary new keyword.

line 32 col 6: Prefer to use whereType on iterable.

line 33 col 17: Unnecessary new keyword.

line 39 col 5: Unnecessary new keyword.

line 47 col 21: Unnecessary new keyword.

Fix additional 14 files with analysis or formatting issues. (-31.03 points)

Additional issues in the following files:

  • lib/src/cli.dart (10 hints)
  • lib/src/discover_tasks.dart (10 hints)
  • lib/src/utils.dart (10 hints)
  • lib/src/run.dart (7 hints)
  • lib/grinder_tools.dart (6 hints)
  • bin/init.dart (3 hints)
  • lib/grinder.dart (3 hints)
  • lib/src/grinder_task.dart (3 hints)
  • lib/src/run_utils.dart (3 hints)
  • lib/src/singleton.dart (3 hints)
  • lib/src/cli_util.dart (2 hints)
  • bin/grinder.dart (1 hint)
  • lib/src/grinder_context.dart (1 hint)
  • lib/src/task_invocation.dart (1 hint)

Maintenance suggestions

Maintain an example.

None of the files in the package's example/ directory matches known example patterns.

Common filename patterns include main.dart, example.dart, and grinder.dart. Packages with multiple examples should provide example/

For more information see the pub package layout conventions.


Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.0.0 <3.0.0
cli_util ^0.1.2 0.1.3+2
glob ^1.0.0 1.2.0
meta ^1.1.7 1.1.8
path ^1.0.0 1.6.4
Transitive dependencies
async 2.4.0
charcode 1.1.3
collection 1.14.12
js 0.6.1+1
node_interop 1.0.3
node_io 1.0.1+2
source_span 1.6.0
string_scanner 1.0.5
term_glyph 1.1.0
Dev dependencies
pedantic ^1.7.0 1.9.0
test ^1.0.0