diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index c3522f0..eaa7efc 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.1.24
+
+* Moved logic from bin/ to lib/ to help customers wrap up the behavior.
+* Added some more linter ignores for Dart.
+
 ## 0.1.23
 
 * More Java linter and linter fixes.
diff --git a/packages/pigeon/bin/pigeon.dart b/packages/pigeon/bin/pigeon.dart
index 33f44a1..ec65f9d 100644
--- a/packages/pigeon/bin/pigeon.dart
+++ b/packages/pigeon/bin/pigeon.dart
@@ -4,71 +4,8 @@
 
 // @dart = 2.2
 
-import 'dart:async';
-import 'dart:io';
-import 'dart:isolate';
-
-import 'package:path/path.dart' as path;
-import 'package:pigeon/pigeon_lib.dart';
-
-/// This creates a relative path from `from` to `input`, the output being a
-/// posix path on all platforms.
-String _posixRelative(String input, {String from}) {
-  final path.Context context = path.Context(style: path.Style.posix);
-  final String rawInputPath = input;
-  final String absInputPath = File(rawInputPath).absolute.path;
-  // By going through URI's we can make sure paths can go between drives in
-  // Windows.
-  final Uri inputUri = path.toUri(absInputPath);
-  final String posixAbsInputPath = context.fromUri(inputUri);
-  final Uri tempUri = path.toUri(from);
-  final String posixTempPath = context.fromUri(tempUri);
-  return context.relative(posixAbsInputPath, from: posixTempPath);
-}
+import 'package:pigeon/pigeon_cl.dart';
 
 Future<void> main(List<String> args) async {
-  final PigeonOptions opts = Pigeon.parseArgs(args);
-  final Directory tempDir = Directory.systemTemp.createTempSync(
-    'flutter_pigeon.',
-  );
-
-  String importLine = '';
-  if (opts.input != null) {
-    final String relInputPath = _posixRelative(opts.input, from: tempDir.path);
-    importLine = 'import \'$relInputPath\';\n';
-  }
-  final String code = """
-// @dart = 2.2
-$importLine
-import 'dart:io';
-import 'dart:isolate';
-import 'package:pigeon/pigeon_lib.dart';
-
-void main(List<String> args, SendPort sendPort) async {
-  sendPort.send(await Pigeon.run(args));
-}
-""";
-  final File tempFile = File(path.join(tempDir.path, '_pigeon_temp_.dart'));
-  await tempFile.writeAsString(code);
-  final ReceivePort receivePort = ReceivePort();
-  Isolate.spawnUri(
-    // Using Uri.file instead of Uri.parse in order to parse backslashes as
-    // path segment separator with Windows semantics.
-    Uri.file(tempFile.path),
-    args,
-    receivePort.sendPort,
-  );
-
-  final Completer<int> completer = Completer<int>();
-  receivePort.listen((dynamic message) {
-    try {
-      // ignore: avoid_as
-      completer.complete(message as int);
-    } catch (exception) {
-      completer.completeError(exception);
-    }
-  });
-  final int exitCode = await completer.future;
-  tempDir.deleteSync(recursive: true);
-  exit(exitCode);
+  await runCommandLine(args);
 }
diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart
index 2d4d823..168ac86 100644
--- a/packages/pigeon/lib/dart_generator.dart
+++ b/packages/pigeon/lib/dart_generator.dart
@@ -197,7 +197,7 @@
   indent.writeln('// $generatedCodeWarning');
   indent.writeln('// $seeAlsoWarning');
   indent.writeln(
-    '// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators',
+    '// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types',
   );
   indent.writeln('// @dart = ${opt.isNullSafe ? '2.12' : '2.8'}');
   indent.writeln('import \'dart:async\';');
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 6b64189..895c58e 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -8,7 +8,7 @@
 import 'ast.dart';
 
 /// The current version of pigeon. This must match the version in pubspec.yaml.
-const String pigeonVersion = '0.1.23';
+const String pigeonVersion = '0.1.24';
 
 /// Read all the content from [stdin] to a String.
 String readStdin() {
diff --git a/packages/pigeon/lib/pigeon_cl.dart b/packages/pigeon/lib/pigeon_cl.dart
new file mode 100644
index 0000000..b605d9d
--- /dev/null
+++ b/packages/pigeon/lib/pigeon_cl.dart
@@ -0,0 +1,75 @@
+// Copyright 2020 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:path/path.dart' as path;
+import 'package:pigeon/pigeon_lib.dart';
+
+/// This creates a relative path from `from` to `input`, the output being a
+/// posix path on all platforms.
+String _posixRelative(String input, {String from}) {
+  final path.Context context = path.Context(style: path.Style.posix);
+  final String rawInputPath = input;
+  final String absInputPath = File(rawInputPath).absolute.path;
+  // By going through URI's we can make sure paths can go between drives in
+  // Windows.
+  final Uri inputUri = path.toUri(absInputPath);
+  final String posixAbsInputPath = context.fromUri(inputUri);
+  final Uri tempUri = path.toUri(from);
+  final String posixTempPath = context.fromUri(tempUri);
+  return context.relative(posixAbsInputPath, from: posixTempPath);
+}
+
+/// This is the main entrypoint for the command-line tool.  [args] are the
+/// commmand line arguments and there is an optional [packageConfig] to
+/// accomodate users that want to integrate pigeon with other build systems.
+Future<void> runCommandLine(List<String> args, {Uri packageConfig}) async {
+  final PigeonOptions opts = Pigeon.parseArgs(args);
+  final Directory tempDir = Directory.systemTemp.createTempSync(
+    'flutter_pigeon.',
+  );
+
+  String importLine = '';
+  if (opts.input != null) {
+    final String relInputPath = _posixRelative(opts.input, from: tempDir.path);
+    importLine = 'import \'$relInputPath\';\n';
+  }
+  final String code = """
+// @dart = 2.2
+$importLine
+import 'dart:io';
+import 'dart:isolate';
+import 'package:pigeon/pigeon_lib.dart';
+void main(List<String> args, SendPort sendPort) async {
+  sendPort.send(await Pigeon.run(args));
+}
+""";
+  final File tempFile = File(path.join(tempDir.path, '_pigeon_temp_.dart'));
+  await tempFile.writeAsString(code);
+  final ReceivePort receivePort = ReceivePort();
+  Isolate.spawnUri(
+    // Using Uri.file instead of Uri.parse in order to parse backslashes as
+    // path segment separator with Windows semantics.
+    Uri.file(tempFile.path),
+    args,
+    receivePort.sendPort,
+    packageConfig: packageConfig,
+  );
+
+  final Completer<int> completer = Completer<int>();
+  receivePort.listen((dynamic message) {
+    try {
+      // ignore: avoid_as
+      completer.complete(message as int);
+    } catch (exception) {
+      completer.completeError(exception);
+    }
+  });
+  final int exitCode = await completer.future;
+  tempDir.deleteSync(recursive: true);
+  exit(exitCode);
+}
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index 66894c2..13a23694 100644
--- a/packages/pigeon/pubspec.yaml
+++ b/packages/pigeon/pubspec.yaml
@@ -1,5 +1,5 @@
 name: pigeon
-version: 0.1.23 # This must match the version in lib/generator_tools.dart
+version: 0.1.24 # This must match the version in lib/generator_tools.dart
 description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
 homepage: https://github.com/flutter/packages/tree/master/packages/pigeon
 dependencies:
