pana 0.12.8

  • Installing
  • Versions
  • 68

Build Status

A library for analyzing Dart packages. It invokes executables from the Dart SDK (or from the Flutter SDK if the package uses Flutter).

  • Checks for outdated dependencies (calls pub upgrade or flutter packages upgrade).
  • Validates the code using Dart Analyzer.
  • Checks code formatting (dartfmt or flutter format).
  • Infers supported platforms: Flutter, web, and/or other (e.g console/server).
  • Creates suggestions to improve the package.

Used by the Dart Package site.

Use as an executable


> pub global activate pana


You can specify either a package (+ version) or a local directory to analyze:

Usage: pana [<options>] <published package name> [<version>]
       pana [<options>] --source path <local directory>

      --flutter-sdk     The directory of the Flutter SDK.
  -j, --json            Output log items as JSON.
  -s, --source          The source where the package is located (hosted on, or local directory path).
                        [hosted (default), path]
      --hosted-url      The server that hosts <package>.
                        (defaults to "")
      --verbosity       Configure the details in the output.
                        [compact, normal (default), verbose]
      --[no-]warning    Shows the warning message before potentially destructive operation.
                        (defaults to on)


Health score

A package gets 0.0 if any major analyzer process fails (e.g. pub upgrade, dartanalyzer or dartfmt).

Otherwise the score starts with 1.0, and

  • analyzer errors reduce it by 25%
  • analyzer warnings reduce it by 5%
  • analyzer hints reduce it by 0.5%
  • platform conflicts reduce it by 0.25 points (absolute reduction)

health = 0.75^errors * 0.95^warnings * 0.995^hints - 0.25*conflicts

Pub site transforms this score into the [0 - 100] range.

Maintenance score

A package starts with 100 points, and the following detected issues have point reductions:

  • uses strong-mode: false in analysis_options.yaml (-50 points)
  • SDK constraint is missing from pubspec.yaml (-50 points)
  • missing (-30 points)
  • missing (-20 points)
  • has platform conflicts (-20 points)
  • has unconstrained dependencies (-20 points)
  • does not allow latest stable SDK (-20 points)
  • description is too short (<60 characters) (-20 points)
  • description contains too many non-ASCII characters (-20 points)
  • homepage points to non-existent URL (-20 points)
  • homepage is not helpful (e.g. pointing to http://localhost/) (-10 points)
  • documentation points to non-existent URL (-10 points)
  • documentation is not helpful (e.g. pointing to http://localhost/) (-10 points)
  • description is too long (>180 characters) (-10 points)
  • package has no example file (-10 points)
  • uses old .analysis_options file (-10 points)
  • uses pre-v0.1 release versioning (0.0.*) (-10 points)
  • uses pre-release versioning (*.*.*-beta2) (-5 points)

On top of that, pub site applies an age restriction:

  • outdated packages (age older than two years) are reduced to 0
  • old packages (age between 1 and 2 years) get linear reduction (1.5 years old get 50% reduction)


  • Code cleanup.

  • Reduce the amount of warning+ level log messages when tools fail.

  • Handle package with bad pubspec.yaml.


  • Reduce the amount of logging when dartfmt fails due to an issue in the package.

  • Display Dart SDK warning if package doesn't allow the latest Dart 2.X version.


  • Bulk processing and comparison.

  • Penalty for description using too many non-ASCII characters.

  • Use --dry-run on executing flutter format.

  • Retry the external process on downloading and listing packages.

  • Use Flutter's internal Dart SDK to run dartanalyzer on Flutter packages.


  • Increase the severity of missing SDK constraint.

  • Make example/ the first-level example-file candidate.

  • Scores values should be consistently in the [0.0-1.0] range.


  • Documented how scoring works.

  • Estimate health score penalties.


  • Increased dartfmt timeout to 5 minutes.

  • Store basic stats in the analysis summary.

  • Detect example/ (or similar pattern) as an alternative to single .dart example.


  • Bugfix: pre-v1 release should be pre-v0.1 instead.


  • Bugfix: packages without Dart files failed the health checks.


Breaking changes:

  • Named parameters in the following constructors: Summary, DartFileSummary, PkgDependency, CodeProblem.

  • Removed per-file and overall Fitness, using a top-level Health report instead. Follows the proposed changes that allow us to clearly communicate the scoring mechanism.

  • Removed Penalty and using the simpler to understand score in place of it.


  • Use flutter format for Flutter packages.

  • Support relative local path with --source path.

  • Track tool failures and set health score to 0 if there is any.


  • Support Dart 2 gold release.

  • Remove strong-mode: true check and suggestion.

  • Do not check existence of non-external URLs.

  • API for external caching of URL existence checks.


  • Suggestions for SDK constraint and Dart 2 compatibility.


  • Updated report on dartanalyzer suggestions.


  • Less verbose logging.

  • Updated platform classification:

    • Library conflict rule is moved to the end of the evaluation.
    • Top file-related suggestions are directly exposed.
    • The bulk summary suggestion is more compact.
  • Updated suggestion messages.


  • Export libraries used by pub site.

  • Update minimum SDK to 2.0.0-dev.42.0

    • The SDK was effectively restricted to at least this version due to other dependencies.
  • Better expose platform conflict reasons.


  • Support changing part of the analysis result.

  • Fix dartdoc timeout when using pub global run.


  • dartdoc processing: do not exclude packages by default, as dartdoc 0.19 handles SDK links.

  • expose getAgeSuggestion method for pub site

  • Update analyzer dependency to ^0.32.0.


  • Upgrade CI to dev.54 and fix new deprecation warnings.

  • Bugfix: do not initialize dartdocSuccessful with a value.

  • Support --flutter-sdk in the pana binary.


Breaking changes:

  • DartSdk, FlutterSdk and PubEnvironment is replaced with ToolEnvironment.

  • ToolEnvironment.runAnalyzer returns the text output of the process.

  • Consolidating options in InspectOptions, changing PackageAnalyzer APIs.

  • Move all output-related data structure to src/model.dart:

    • CodeProblem.parse -> parseCodeProblem
    • Maintenance.getMaintenanceScore -> getMaintenanceScore
    • PkgResolution.create -> createPkgResolution
  • Move all runtime/version info into PanaRuntimeInfo (and use it in Summary).

  • Removed Fitness.suggestions (moved it to DartFileSummary)


  • Run dartdoc (optional) and report if it was not able to complete successfully.

  • Added a top-level models.dart library exposing several of the data classes.

  • Check homepage and documentation properties to point to an existing and external web page.

  • --verbose command-line and Verbosity option to control the details in the analysis output.


  • Enable Dart 2 Preview in analyzer options (including non-Flutter packages).

  • Change platform classification of dart:isolate: no longer available on web.

  • Treat environment: keys as dependent SDKs (e.g. flutter).

  • Use LibraryElement.hasExtUri to detect dart-ext: imports.

  • Detailed suggestion messages when package has conflicting platforms.


  • Enable Dart 2 Preview in Flutter analyzer options.


  • Fix CI test

  • Flutter-specific suggestion messages for dartfmt and dartanalyzer.


  • Fix end-to-end test (package dependency changed).

  • Move pubspec stripping inside PubEnvironment.runUpgrade (dartdoc service will get it for free).

  • Handle more repository URLs (e.g.

  • Expose Flutter detection to clients, with better naming (isFlutter -> usesFlutter).


  • Fix issue of not using the PUB_CACHE directory when it was set.

  • Update analyzer to 0.31 and extends quiver version range.

  • Fix issue where we were not passing the proper package directory variable.

  • Expose all dartanalyzer and dartfmt problems as suggestions.


  • Include component list in platform classification reasons.

  • Do not report on unconstrained SDK dependencies.

  • New platform component: build.

  • Remove dependency_overrides from pubspec.yaml.



  • Removed DartPlatform.description and DartPlatform.descriptionAndReason because we don't use them elsewhere and complicates the PlatformNames with everywhere and undefined.

  • Removed PlatformNames.everywhere and PlatformNames.undefined, because we don't print these anywhere except in tests.

  • Removed PlatformNames.dartExtension, because we use it only internally.

  • Removed DartPlatform.restrictedTo, using the fields components and uses instead.

  • Removed PlatformNames.server (and its platform detection), using a wider other platform instead.


  • Use raw links for images in repository URLs.

  • Move unconstrained version penalty from health score to maintenance.

  • Move platform conflict penalty from health score to maintenance.

  • Sort maintenance suggestions in decreasing importance.


  • Fix NPE when dependency has no constraint (e.g. git repo).


  • Only direct unconstrained dependencies decrease the health score.

  • Removed superfluous pubspec.lock validation.

  • Recommend descriptions between 60 and 180 characters.

  • Detect another license format

  • Pass-through values of analyzer_options.yaml errors like uri_has_not_been_generated.


  • Unblock platform classification on a new class of errors.

  • Better messages in platform classification.


  • Use Flutter-recommended analysis options when analyzer Flutter packages.

  • BREAKING BEHAVIOR: Don't use PUB_HOSTED_URL for package downloads, as it has not worked out in practice. Instead, we've added a --hosted-url command line argument.


  • PackageAnalyzer.inspectPackage added a named argument deleteTemporaryDirectory. Setting this to false retains the directory and prints its location to the log. Useful for debugging.

  • Maintenance

    • BREAKING getMaintenanceScore now takes an optional age parameter replacing the previously required publishDate parameter.

    • Changed the meaning of version fields:

      • isExperimentalVersion now means pre-V1.
      • isPreReleaseVersion now means there is a pre-release flag like -beta, -alpha, etc.
    • BREAKING maintenance-related Suggestion entries as moved to Maintenance.suggestions

  • BREAKING Suggestion.file is now String instead of dynamic.

  • Detect the new format of native extensions.

  • Unblock platform classification on a new class of errors.

  • Use PUB_HOSTED_URL for package downloads.


  • Allow more versions of package:args.


  • Added pana as an executable. Enables pub global activate pana.

  • Improved license detection: commented license files are now recognized.


  • Handle more critical exceptions and report them with more details.

  • The Suggestion.bug constructor had a breaking change – a required argument was added, but this is not intended for invocation by end-users.


  • Add SuggestionLevel.bug and use it to record fatal errors with the tool.


  • Fixed issue where analyzer and/or formatter were run on directories with no Dart files.


  • Breaking changes

    • Summary.sdkVersion is now a Version instead of String.

    • new PackageAnalyzer(...) now takes a DartSdk instance instead of a String.

  • static Future<PackageAnalyzer> create(...) was added to PackageAnalyzer.

  • Added logger optional argument to PackageAnalyzer.inspectPackage.


  • Allow platform classification for a small class of analysis errors.


  • Don't count the absence of an analysis_options.yaml file against a package.


  • Breaking changes

    • Removed ToolProblem class.
    • Removed Summary.toolProblems, in favor of Summary.suggestions.
  • Detect and store maintenance-related data in summary.

    • Scoring of tool problems moved from Fitness to Maintenance.
  • Provide human-readable feedback and instructions on some of the issues we find during the analysis.


  • Use a consistent 2 minute timeout for all processes.

  • Classify platform as nowhere when part of analysis fails.


  • Breaking changes

    • License renamed to LicenseFile
    • Summary.license -> licenses: we'll return multiple licenses
    • Removed LicenseNames.missing: empty List will indicate no license file
  • Greatly expanded and improved license detection.


  • Breaking changes

    • Renamed AnalyzerIssue -> ToolProblem

      • Renamed Summary.issues -> toolProblems
      • Renamed AnalyzerIssue.scope -> tool
      • Renamed AnalyzerScopes -> ToolNames
    • Renamed AnalyzerOutput -> CodeProblem

      • Renamed Summary.analyzerItems and DartFileSummary.analyzerItems -> codeProblems
    • Refactored CodeProblem (previously AnalyzerOutput):

      • Split up type, new fields: severity, errorType, errorCode
      • Renamed error to description
    • Refactored Fitness:

      • Renamed total -> magnitude
      • Removed value, using shortcoming instead (value = magnitude - shortcoming;)
    • Refactored PubSummary, renamed to PkgResolution

      • Moved pubspec -> Summary
      • Moved pkgVersion -> Pubspec.version
      • Moved authors -> Pubspec.authors
      • Merged packageVersions and availableVersions into dependencies
      • Renamed Summary.pubSummary -> pkgResolution
    • Refactored platform:

      • Renamed PlatformFlags -> PlatformNames
      • Removed most of the platform-related classes, using DartPlatform instead


  • Removed PlatformSummary.package in favor of PlatformSummary.pubspec of (new) type PubspecPlatform.

  • Renamed KnownPlatforms to PlatformFlags. Also:

    • Removed mirrors, browser and standalone.
    • Renamed native to dartExtension.
  • PlatformInfo

    • Now store dart:* references directly in uses.
    • worksInStandalone renamed to worksOnServer.
    • Other .worksIn* renamed to worksOn*.
    • Added String get description which returns a simple String description of the supported platforms. Examples: everywhere, flutter, server, web, conflict.
    • Removed angular as a value in uses.


  • Detect native extensions.

  • Detect licenses.


  • Lot's of stability improvements.

  • Improvements to error handling.


  • Lot's of cleanup to JSON output.

  • Improved stability.

  • Platform detection basics.


  • Added support for flutter packages.

  • Expanded analysis to include transitive dependencies.

  • Added scoring library.

  • Moved the repo to dart-lang.


  • A lot of tweaks. Still under heavy development.


  • Initial version.

Use this package as an executable

1. Install it

You can install the package from the command line:

$ pub global activate pana

2. Use it

The package has the following executables:

$ pana

Use this package as a library

1. Depend on it

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

  pana: ^0.12.8

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:pana/pana.dart';
Version Uploaded Documentation Archive
0.12.8 Dec 12, 2018 Go to the documentation of pana 0.12.8 Download pana 0.12.8 archive
0.12.7 Nov 20, 2018 Go to the documentation of pana 0.12.7 Download pana 0.12.7 archive
0.12.6 Nov 9, 2018 Go to the documentation of pana 0.12.6 Download pana 0.12.6 archive
0.12.5 Oct 10, 2018 Go to the documentation of pana 0.12.5 Download pana 0.12.5 archive
0.12.4 Sep 26, 2018 Go to the documentation of pana 0.12.4 Download pana 0.12.4 archive
0.12.3 Sep 17, 2018 Go to the documentation of pana 0.12.3 Download pana 0.12.3 archive
0.12.2 Sep 5, 2018 Go to the documentation of pana 0.12.2 Download pana 0.12.2 archive
0.12.1 Sep 3, 2018 Go to the documentation of pana 0.12.1 Download pana 0.12.1 archive
0.12.0 Aug 27, 2018 Go to the documentation of pana 0.12.0 Download pana 0.12.0 archive
0.11.9 Aug 21, 2018 Go to the documentation of pana 0.11.9 Download pana 0.11.9 archive

All 53 versions...

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 Dec 12, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.1.0
  • pana: 0.12.7


Detected platforms: Flutter, other

Primary library: package:pana/pana.dart with components: io.

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 pana.dart.


Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.0.0 <3.0.0
analyzer ^0.34.0 0.34.0
args >=0.13.7 <2.0.0 1.5.1
async >=1.13.3 <3.0.0 2.0.8
cli_util ^0.1.1 0.1.3+2
http >=0.11.3 <0.13.0 0.12.0
io ^0.3.0 0.3.3
json_annotation ^2.0.0 2.0.0
logging ^0.11.3+1 0.11.3+2
meta ^1.1.2 1.1.6
package_config >=0.1.5 <2.0.0 1.0.5
path ^1.4.1 1.6.2
pool ^1.3.6 1.3.6
pub_semver ^1.3.2 1.4.2
pubspec_parse ^0.1.2 0.1.2+3
quiver >=0.24.0 <3.0.0 2.0.1
yaml ^2.1.12 2.1.15
Transitive dependencies
charcode 1.1.2
collection 1.14.11
convert 2.0.2
crypto 2.0.6
csslib 0.14.6
front_end 0.1.7
glob 1.1.7
html 0.13.3+3
http_parser 3.1.3
kernel 0.3.7
matcher 0.12.4
plugin 0.2.0+3
source_span 1.4.1
stack_trace 1.9.3
string_scanner 1.0.4
typed_data 1.1.6
utf 0.9.0+5
watcher 0.9.7+10
Dev dependencies
build ^1.0.0
build_config >=0.2.1 <0.4.0
build_runner ^1.0.0
build_verify ^1.0.0
build_version ^2.0.0
json_serializable ^2.0.0
pedantic ^1.3.0
source_gen ^0.9.0
test ^1.3.3
test_descriptor ^1.0.3
test_process ^1.0.1