Add lint avoid_print (#3475)

diff --git a/analysis_options.yaml b/analysis_options.yaml
index 6177eba..2dc5e37 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -12,6 +12,7 @@
 linter:
   rules:
     - avoid_catching_errors
+    - avoid_print
     - avoid_private_typedef_functions
     - avoid_redundant_argument_values
     - avoid_returning_null_for_future
diff --git a/lib/src/log.dart b/lib/src/log.dart
index db24d7a..d8150c0 100644
--- a/lib/src/log.dart
+++ b/lib/src/log.dart
@@ -617,6 +617,6 @@
   void message(message) {
     if (!enabled) return;
 
-    print(jsonEncode(message));
+    stdout.writeln(jsonEncode(message));
   }
 }
diff --git a/test/add/common/add_test.dart b/test/add/common/add_test.dart
index 02459cc..f1e76a7 100644
--- a/test/add/common/add_test.dart
+++ b/test/add/common/add_test.dart
@@ -146,8 +146,6 @@
       ]).create();
 
       await pubAdd(args: ['foo:1.2.3']);
-      print(
-          File(p.join(d.sandbox, appPath, 'pubspec.yaml')).readAsStringSync());
       final yaml = loadYaml(
           File(p.join(d.sandbox, appPath, 'pubspec.yaml')).readAsStringSync());
 
diff --git a/tool/extract_all_pub_dev.dart b/tool/extract_all_pub_dev.dart
index 323c05c..474c897 100644
--- a/tool/extract_all_pub_dev.dart
+++ b/tool/extract_all_pub_dev.dart
@@ -14,6 +14,7 @@
 import 'package:pool/pool.dart';
 import 'package:pub/src/http.dart';
 import 'package:pub/src/io.dart';
+import 'package:pub/src/log.dart' as log;
 
 const statusFilename = 'extract_all_pub_status.json';
 
@@ -41,8 +42,8 @@
       failures.add(failure);
     }
   }
-  print('Already processed ${alreadyDonePackages.length} packages');
-  print('Already found ${alreadyDonePackages.length}');
+  log.message('Already processed ${alreadyDonePackages.length} packages');
+  log.message('Already found ${alreadyDonePackages.length}');
 
   void writeStatus() {
     writeTextFile(
@@ -52,7 +53,7 @@
         'failures': [...failures],
       }),
     );
-    print('Wrote status to $statusFilename');
+    log.message('Wrote status to $statusFilename');
   }
 
   ProcessSignal.sigint.watch().listen((_) {
@@ -65,10 +66,10 @@
   try {
     for (final packageName in await allPackageNames()) {
       if (alreadyDonePackages.contains(packageName)) {
-        print('Skipping $packageName - already done');
+        log.message('Skipping $packageName - already done');
         continue;
       }
-      print('Processing all versions of $packageName '
+      log.message('Processing all versions of $packageName '
           '[+${alreadyDonePackages.length}, - ${failures.length}]');
       final resource = await pool.request();
       scheduleMicrotask(() async {
@@ -77,15 +78,15 @@
           var allVersionsGood = true;
           await Future.wait(versions.map((archiveUrl) async {
             await withTempDir((tempDir) async {
-              print('downloading $archiveUrl');
+              log.message('downloading $archiveUrl');
               http.StreamedResponse response;
               try {
                 response = await httpClient
                     .send(http.Request('GET', Uri.parse(archiveUrl)));
                 await extractTarGz(response.stream, tempDir);
-                print('Extracted $archiveUrl');
+                log.message('Extracted $archiveUrl');
               } catch (e) {
-                print('Failed to get and extract $archiveUrl $e');
+                log.message('Failed to get and extract $archiveUrl $e');
                 failures.add({'archive': archiveUrl, 'error': e.toString()});
                 allVersionsGood = false;
                 return;
diff --git a/tool/test.dart b/tool/test.dart
index 3aabf88..57ab554 100755
--- a/tool/test.dart
+++ b/tool/test.dart
@@ -18,7 +18,7 @@
 
 Future<void> main(List<String> args) async {
   if (Platform.environment['FLUTTER_ROOT'] != null) {
-    print(
+    stderr.writeln(
       'WARNING: The tests will not run correctly with dart from a flutter checkout!',
     );
   }
@@ -30,7 +30,7 @@
       path.absolute(path.join('.dart_tool', '_pub', 'pub.dart.snapshot.dart2'));
   final pubSnapshotIncrementalFilename = '$pubSnapshotFilename.incremental';
   try {
-    print('Building snapshot');
+    stderr.writeln('Building snapshot');
     await precompile(
         executablePath: path.join('bin', 'pub.dart'),
         outputPath: pubSnapshotFilename,
@@ -45,7 +45,7 @@
     );
     exitCode = await testProcess.exitCode;
   } on ApplicationException catch (e) {
-    print('Failed building snapshot: $e');
+    stderr.writeln('Failed building snapshot: $e');
     exitCode = 1;
   } finally {
     try {