Re-organize repo (#83)

Before, package:file/testing.dart was a library containing testing
utilities.  That library depended on package:test.  However, we
explicitly didn't declare a dependency on `test` in the pubspec.yaml
because most users of package:file don't want that dependency.

Unfortunately, there's no way to have library-specific sections within
a pubspec.yaml.  So in order to declare that those testing utilities
did in fact depend on `package:test`, we had to publish them as a
separate package.  This change does just that, as `package:file_testing`.
diff --git a/.gitignore b/.gitignore
index ccd6b4c..baf534c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,8 +3,6 @@
 .buildlog
 .dart_tool/
 .pub/
-build/
-packages
 .packages
 
 # Or the files created by dart2js.
diff --git a/.travis.yml b/.travis.yml
index ac8172c..0b16974 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,9 +1,8 @@
-language: dart
-
-dart:
-  - dev
-
-dart_task:
-  - test
-  - dartanalyzer
-  - dartfmt
+env:
+  - SHARD=dartfmt
+  - SHARD=analyze
+  - SHARD=tests
+install:
+  - ./dev/bots/travis_install.sh
+script:
+  - ./dev/bots/travis_script.sh
diff --git a/appveyor.yml b/appveyor.yml
index 0f08276..319ec41 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -2,11 +2,11 @@
   - ps: wget https://storage.googleapis.com/dart-archive/channels/dev/release/latest/sdk/dartsdk-windows-x64-release.zip -OutFile dart-sdk.zip
   - cmd: echo "Unzipping dart-sdk..."
   - cmd: 7z x dart-sdk.zip -o"C:\tools" -y > nul
-  - ps: refreshenv
   - set PATH=%PATH%;C:\tools\dart-sdk\bin
   - set PATH=%PATH%;%APPDATA%\Pub\Cache\bin
+  - cmd: cd packages\file
   - ps: pwd
-  - pub get
+  - cmd: pub get
 
 build: off
 
diff --git a/dev/bots/travis_install.sh b/dev/bots/travis_install.sh
new file mode 100755
index 0000000..ff2f932
--- /dev/null
+++ b/dev/bots/travis_install.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+set -ex
+
+echo "$PWD"
+
+export PATH="$HOME/dart-sdk/bin:$PATH"
+export ROOT="$PWD"
+export PACKAGES=("file" "file_testing")
+
+wget \
+    --tries=3 \
+    --output-document=dart-sdk.zip \
+    https://storage.googleapis.com/dart-archive/channels/dev/release/latest/sdk/dartsdk-linux-x64-release.zip
+echo "Unzipping dart-sdk..."
+unzip dart-sdk.zip -d "$HOME" > /dev/null
+
+for package in "${PACKAGES[@]}"; do
+  cd $ROOT/packages/$package
+  pub get
+done
diff --git a/dev/bots/travis_script.sh b/dev/bots/travis_script.sh
new file mode 100755
index 0000000..fe55e57
--- /dev/null
+++ b/dev/bots/travis_script.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+set -ex
+
+export PATH="$HOME/dart-sdk/bin:$PATH"
+export ROOT="$PWD"
+export PACKAGES=("file" "file_testing")
+
+if [[ "$SHARD" == "dartfmt" ]]; then
+  dartfmt --dry-run --set-exit-if-changed packages || exit $?
+elif [[ "$SHARD" == "analyze" ]]; then
+  for package in "${PACKAGES[@]}"; do
+    echo "Analyzing packages/$package"
+    cd $ROOT/packages/$package
+    dartanalyzer --options=$ROOT/analysis_options.yaml . || exit $?
+  done
+else
+  # tests shard
+  cd $ROOT/packages/file
+  pub run test -j1 -rexpanded || exit $?
+fi
diff --git a/CHANGELOG.md b/packages/file/CHANGELOG.md
similarity index 92%
rename from CHANGELOG.md
rename to packages/file/CHANGELOG.md
index 232542c..ecbec36 100644
--- a/CHANGELOG.md
+++ b/packages/file/CHANGELOG.md
@@ -1,3 +1,9 @@
+#### 5.0.0
+
+* Moved `testing` library into a dedicated `package:file_testing` so that
+  libraries don't need to take on a transitive dependency on `package:test`
+  in order to use `package:file`.
+
 #### 4.0.1
 
 * General library cleanup
diff --git a/LICENSE b/packages/file/LICENSE
similarity index 100%
rename from LICENSE
rename to packages/file/LICENSE
diff --git a/README.md b/packages/file/README.md
similarity index 98%
rename from README.md
rename to packages/file/README.md
index ca319be..9286824 100644
--- a/README.md
+++ b/packages/file/README.md
@@ -4,6 +4,8 @@
 
 A generic file system abstraction for Dart.
 
+## Features
+
 Like `dart:io`, `package:file` supplies a rich Dart-idiomatic API for accessing
 a file system.
 
diff --git a/lib/chroot.dart b/packages/file/lib/chroot.dart
similarity index 100%
rename from lib/chroot.dart
rename to packages/file/lib/chroot.dart
diff --git a/lib/file.dart b/packages/file/lib/file.dart
similarity index 100%
rename from lib/file.dart
rename to packages/file/lib/file.dart
diff --git a/lib/local.dart b/packages/file/lib/local.dart
similarity index 100%
rename from lib/local.dart
rename to packages/file/lib/local.dart
diff --git a/lib/memory.dart b/packages/file/lib/memory.dart
similarity index 100%
rename from lib/memory.dart
rename to packages/file/lib/memory.dart
diff --git a/lib/record_replay.dart b/packages/file/lib/record_replay.dart
similarity index 100%
rename from lib/record_replay.dart
rename to packages/file/lib/record_replay.dart
diff --git a/lib/src/backends/chroot.dart b/packages/file/lib/src/backends/chroot.dart
similarity index 100%
rename from lib/src/backends/chroot.dart
rename to packages/file/lib/src/backends/chroot.dart
diff --git a/lib/src/backends/chroot/chroot_directory.dart b/packages/file/lib/src/backends/chroot/chroot_directory.dart
similarity index 100%
rename from lib/src/backends/chroot/chroot_directory.dart
rename to packages/file/lib/src/backends/chroot/chroot_directory.dart
diff --git a/lib/src/backends/chroot/chroot_file.dart b/packages/file/lib/src/backends/chroot/chroot_file.dart
similarity index 100%
rename from lib/src/backends/chroot/chroot_file.dart
rename to packages/file/lib/src/backends/chroot/chroot_file.dart
diff --git a/lib/src/backends/chroot/chroot_file_system.dart b/packages/file/lib/src/backends/chroot/chroot_file_system.dart
similarity index 100%
rename from lib/src/backends/chroot/chroot_file_system.dart
rename to packages/file/lib/src/backends/chroot/chroot_file_system.dart
diff --git a/lib/src/backends/chroot/chroot_file_system_entity.dart b/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart
similarity index 100%
rename from lib/src/backends/chroot/chroot_file_system_entity.dart
rename to packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart
diff --git a/lib/src/backends/chroot/chroot_link.dart b/packages/file/lib/src/backends/chroot/chroot_link.dart
similarity index 100%
rename from lib/src/backends/chroot/chroot_link.dart
rename to packages/file/lib/src/backends/chroot/chroot_link.dart
diff --git a/lib/src/backends/local.dart b/packages/file/lib/src/backends/local.dart
similarity index 100%
rename from lib/src/backends/local.dart
rename to packages/file/lib/src/backends/local.dart
diff --git a/lib/src/backends/local/local_directory.dart b/packages/file/lib/src/backends/local/local_directory.dart
similarity index 100%
rename from lib/src/backends/local/local_directory.dart
rename to packages/file/lib/src/backends/local/local_directory.dart
diff --git a/lib/src/backends/local/local_file.dart b/packages/file/lib/src/backends/local/local_file.dart
similarity index 100%
rename from lib/src/backends/local/local_file.dart
rename to packages/file/lib/src/backends/local/local_file.dart
diff --git a/lib/src/backends/local/local_file_system.dart b/packages/file/lib/src/backends/local/local_file_system.dart
similarity index 100%
rename from lib/src/backends/local/local_file_system.dart
rename to packages/file/lib/src/backends/local/local_file_system.dart
diff --git a/lib/src/backends/local/local_file_system_entity.dart b/packages/file/lib/src/backends/local/local_file_system_entity.dart
similarity index 100%
rename from lib/src/backends/local/local_file_system_entity.dart
rename to packages/file/lib/src/backends/local/local_file_system_entity.dart
diff --git a/lib/src/backends/local/local_link.dart b/packages/file/lib/src/backends/local/local_link.dart
similarity index 100%
rename from lib/src/backends/local/local_link.dart
rename to packages/file/lib/src/backends/local/local_link.dart
diff --git a/lib/src/backends/memory.dart b/packages/file/lib/src/backends/memory.dart
similarity index 100%
rename from lib/src/backends/memory.dart
rename to packages/file/lib/src/backends/memory.dart
diff --git a/lib/src/backends/memory/common.dart b/packages/file/lib/src/backends/memory/common.dart
similarity index 100%
rename from lib/src/backends/memory/common.dart
rename to packages/file/lib/src/backends/memory/common.dart
diff --git a/lib/src/backends/memory/memory_directory.dart b/packages/file/lib/src/backends/memory/memory_directory.dart
similarity index 100%
rename from lib/src/backends/memory/memory_directory.dart
rename to packages/file/lib/src/backends/memory/memory_directory.dart
diff --git a/lib/src/backends/memory/memory_file.dart b/packages/file/lib/src/backends/memory/memory_file.dart
similarity index 100%
rename from lib/src/backends/memory/memory_file.dart
rename to packages/file/lib/src/backends/memory/memory_file.dart
diff --git a/lib/src/backends/memory/memory_file_stat.dart b/packages/file/lib/src/backends/memory/memory_file_stat.dart
similarity index 100%
rename from lib/src/backends/memory/memory_file_stat.dart
rename to packages/file/lib/src/backends/memory/memory_file_stat.dart
diff --git a/lib/src/backends/memory/memory_file_system.dart b/packages/file/lib/src/backends/memory/memory_file_system.dart
similarity index 100%
rename from lib/src/backends/memory/memory_file_system.dart
rename to packages/file/lib/src/backends/memory/memory_file_system.dart
diff --git a/lib/src/backends/memory/memory_file_system_entity.dart b/packages/file/lib/src/backends/memory/memory_file_system_entity.dart
similarity index 100%
rename from lib/src/backends/memory/memory_file_system_entity.dart
rename to packages/file/lib/src/backends/memory/memory_file_system_entity.dart
diff --git a/lib/src/backends/memory/memory_link.dart b/packages/file/lib/src/backends/memory/memory_link.dart
similarity index 100%
rename from lib/src/backends/memory/memory_link.dart
rename to packages/file/lib/src/backends/memory/memory_link.dart
diff --git a/lib/src/backends/memory/node.dart b/packages/file/lib/src/backends/memory/node.dart
similarity index 100%
rename from lib/src/backends/memory/node.dart
rename to packages/file/lib/src/backends/memory/node.dart
diff --git a/lib/src/backends/memory/style.dart b/packages/file/lib/src/backends/memory/style.dart
similarity index 100%
rename from lib/src/backends/memory/style.dart
rename to packages/file/lib/src/backends/memory/style.dart
diff --git a/lib/src/backends/memory/utils.dart b/packages/file/lib/src/backends/memory/utils.dart
similarity index 100%
rename from lib/src/backends/memory/utils.dart
rename to packages/file/lib/src/backends/memory/utils.dart
diff --git a/lib/src/backends/record_replay/codecs.dart b/packages/file/lib/src/backends/record_replay/codecs.dart
similarity index 100%
rename from lib/src/backends/record_replay/codecs.dart
rename to packages/file/lib/src/backends/record_replay/codecs.dart
diff --git a/lib/src/backends/record_replay/common.dart b/packages/file/lib/src/backends/record_replay/common.dart
similarity index 100%
rename from lib/src/backends/record_replay/common.dart
rename to packages/file/lib/src/backends/record_replay/common.dart
diff --git a/lib/src/backends/record_replay/errors.dart b/packages/file/lib/src/backends/record_replay/errors.dart
similarity index 100%
rename from lib/src/backends/record_replay/errors.dart
rename to packages/file/lib/src/backends/record_replay/errors.dart
diff --git a/lib/src/backends/record_replay/events.dart b/packages/file/lib/src/backends/record_replay/events.dart
similarity index 100%
rename from lib/src/backends/record_replay/events.dart
rename to packages/file/lib/src/backends/record_replay/events.dart
diff --git a/lib/src/backends/record_replay/mutable_recording.dart b/packages/file/lib/src/backends/record_replay/mutable_recording.dart
similarity index 100%
rename from lib/src/backends/record_replay/mutable_recording.dart
rename to packages/file/lib/src/backends/record_replay/mutable_recording.dart
diff --git a/lib/src/backends/record_replay/proxy.dart b/packages/file/lib/src/backends/record_replay/proxy.dart
similarity index 100%
rename from lib/src/backends/record_replay/proxy.dart
rename to packages/file/lib/src/backends/record_replay/proxy.dart
diff --git a/lib/src/backends/record_replay/recording.dart b/packages/file/lib/src/backends/record_replay/recording.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording.dart
rename to packages/file/lib/src/backends/record_replay/recording.dart
diff --git a/lib/src/backends/record_replay/recording_directory.dart b/packages/file/lib/src/backends/record_replay/recording_directory.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording_directory.dart
rename to packages/file/lib/src/backends/record_replay/recording_directory.dart
diff --git a/lib/src/backends/record_replay/recording_file.dart b/packages/file/lib/src/backends/record_replay/recording_file.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording_file.dart
rename to packages/file/lib/src/backends/record_replay/recording_file.dart
diff --git a/lib/src/backends/record_replay/recording_file_system.dart b/packages/file/lib/src/backends/record_replay/recording_file_system.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording_file_system.dart
rename to packages/file/lib/src/backends/record_replay/recording_file_system.dart
diff --git a/lib/src/backends/record_replay/recording_file_system_entity.dart b/packages/file/lib/src/backends/record_replay/recording_file_system_entity.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording_file_system_entity.dart
rename to packages/file/lib/src/backends/record_replay/recording_file_system_entity.dart
diff --git a/lib/src/backends/record_replay/recording_io_sink.dart b/packages/file/lib/src/backends/record_replay/recording_io_sink.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording_io_sink.dart
rename to packages/file/lib/src/backends/record_replay/recording_io_sink.dart
diff --git a/lib/src/backends/record_replay/recording_link.dart b/packages/file/lib/src/backends/record_replay/recording_link.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording_link.dart
rename to packages/file/lib/src/backends/record_replay/recording_link.dart
diff --git a/lib/src/backends/record_replay/recording_proxy_mixin.dart b/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording_proxy_mixin.dart
rename to packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart
diff --git a/lib/src/backends/record_replay/recording_random_access_file.dart b/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart
similarity index 100%
rename from lib/src/backends/record_replay/recording_random_access_file.dart
rename to packages/file/lib/src/backends/record_replay/recording_random_access_file.dart
diff --git a/lib/src/backends/record_replay/replay_directory.dart b/packages/file/lib/src/backends/record_replay/replay_directory.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_directory.dart
rename to packages/file/lib/src/backends/record_replay/replay_directory.dart
diff --git a/lib/src/backends/record_replay/replay_file.dart b/packages/file/lib/src/backends/record_replay/replay_file.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_file.dart
rename to packages/file/lib/src/backends/record_replay/replay_file.dart
diff --git a/lib/src/backends/record_replay/replay_file_stat.dart b/packages/file/lib/src/backends/record_replay/replay_file_stat.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_file_stat.dart
rename to packages/file/lib/src/backends/record_replay/replay_file_stat.dart
diff --git a/lib/src/backends/record_replay/replay_file_system.dart b/packages/file/lib/src/backends/record_replay/replay_file_system.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_file_system.dart
rename to packages/file/lib/src/backends/record_replay/replay_file_system.dart
diff --git a/lib/src/backends/record_replay/replay_file_system_entity.dart b/packages/file/lib/src/backends/record_replay/replay_file_system_entity.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_file_system_entity.dart
rename to packages/file/lib/src/backends/record_replay/replay_file_system_entity.dart
diff --git a/lib/src/backends/record_replay/replay_io_sink.dart b/packages/file/lib/src/backends/record_replay/replay_io_sink.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_io_sink.dart
rename to packages/file/lib/src/backends/record_replay/replay_io_sink.dart
diff --git a/lib/src/backends/record_replay/replay_link.dart b/packages/file/lib/src/backends/record_replay/replay_link.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_link.dart
rename to packages/file/lib/src/backends/record_replay/replay_link.dart
diff --git a/lib/src/backends/record_replay/replay_proxy_mixin.dart b/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_proxy_mixin.dart
rename to packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart
diff --git a/lib/src/backends/record_replay/replay_random_access_file.dart b/packages/file/lib/src/backends/record_replay/replay_random_access_file.dart
similarity index 100%
rename from lib/src/backends/record_replay/replay_random_access_file.dart
rename to packages/file/lib/src/backends/record_replay/replay_random_access_file.dart
diff --git a/lib/src/backends/record_replay/result_reference.dart b/packages/file/lib/src/backends/record_replay/result_reference.dart
similarity index 100%
rename from lib/src/backends/record_replay/result_reference.dart
rename to packages/file/lib/src/backends/record_replay/result_reference.dart
diff --git a/lib/src/common.dart b/packages/file/lib/src/common.dart
similarity index 100%
rename from lib/src/common.dart
rename to packages/file/lib/src/common.dart
diff --git a/lib/src/forwarding.dart b/packages/file/lib/src/forwarding.dart
similarity index 100%
rename from lib/src/forwarding.dart
rename to packages/file/lib/src/forwarding.dart
diff --git a/lib/src/forwarding/forwarding_directory.dart b/packages/file/lib/src/forwarding/forwarding_directory.dart
similarity index 100%
rename from lib/src/forwarding/forwarding_directory.dart
rename to packages/file/lib/src/forwarding/forwarding_directory.dart
diff --git a/lib/src/forwarding/forwarding_file.dart b/packages/file/lib/src/forwarding/forwarding_file.dart
similarity index 100%
rename from lib/src/forwarding/forwarding_file.dart
rename to packages/file/lib/src/forwarding/forwarding_file.dart
diff --git a/lib/src/forwarding/forwarding_file_system.dart b/packages/file/lib/src/forwarding/forwarding_file_system.dart
similarity index 100%
rename from lib/src/forwarding/forwarding_file_system.dart
rename to packages/file/lib/src/forwarding/forwarding_file_system.dart
diff --git a/lib/src/forwarding/forwarding_file_system_entity.dart b/packages/file/lib/src/forwarding/forwarding_file_system_entity.dart
similarity index 100%
rename from lib/src/forwarding/forwarding_file_system_entity.dart
rename to packages/file/lib/src/forwarding/forwarding_file_system_entity.dart
diff --git a/lib/src/forwarding/forwarding_link.dart b/packages/file/lib/src/forwarding/forwarding_link.dart
similarity index 100%
rename from lib/src/forwarding/forwarding_link.dart
rename to packages/file/lib/src/forwarding/forwarding_link.dart
diff --git a/lib/src/interface.dart b/packages/file/lib/src/interface.dart
similarity index 100%
rename from lib/src/interface.dart
rename to packages/file/lib/src/interface.dart
diff --git a/lib/src/interface/directory.dart b/packages/file/lib/src/interface/directory.dart
similarity index 100%
rename from lib/src/interface/directory.dart
rename to packages/file/lib/src/interface/directory.dart
diff --git a/lib/src/interface/error_codes.dart b/packages/file/lib/src/interface/error_codes.dart
similarity index 100%
rename from lib/src/interface/error_codes.dart
rename to packages/file/lib/src/interface/error_codes.dart
diff --git a/lib/src/interface/error_codes_dart_io.dart b/packages/file/lib/src/interface/error_codes_dart_io.dart
similarity index 100%
rename from lib/src/interface/error_codes_dart_io.dart
rename to packages/file/lib/src/interface/error_codes_dart_io.dart
diff --git a/lib/src/interface/error_codes_internal.dart b/packages/file/lib/src/interface/error_codes_internal.dart
similarity index 100%
rename from lib/src/interface/error_codes_internal.dart
rename to packages/file/lib/src/interface/error_codes_internal.dart
diff --git a/lib/src/interface/file.dart b/packages/file/lib/src/interface/file.dart
similarity index 100%
rename from lib/src/interface/file.dart
rename to packages/file/lib/src/interface/file.dart
diff --git a/lib/src/interface/file_system.dart b/packages/file/lib/src/interface/file_system.dart
similarity index 100%
rename from lib/src/interface/file_system.dart
rename to packages/file/lib/src/interface/file_system.dart
diff --git a/lib/src/interface/file_system_entity.dart b/packages/file/lib/src/interface/file_system_entity.dart
similarity index 100%
rename from lib/src/interface/file_system_entity.dart
rename to packages/file/lib/src/interface/file_system_entity.dart
diff --git a/lib/src/interface/link.dart b/packages/file/lib/src/interface/link.dart
similarity index 100%
rename from lib/src/interface/link.dart
rename to packages/file/lib/src/interface/link.dart
diff --git a/lib/src/io.dart b/packages/file/lib/src/io.dart
similarity index 100%
rename from lib/src/io.dart
rename to packages/file/lib/src/io.dart
diff --git a/pubspec.yaml b/packages/file/pubspec.yaml
similarity index 88%
rename from pubspec.yaml
rename to packages/file/pubspec.yaml
index 87e8471..ebd81e7 100644
--- a/pubspec.yaml
+++ b/packages/file/pubspec.yaml
@@ -1,5 +1,5 @@
 name: file
-version: 4.0.1
+version: 5.0.0
 authors:
 - Matan Lurey <matanl@google.com>
 - Yegor Jbanov <yjbanov@google.com>
@@ -14,6 +14,7 @@
 
 dev_dependencies:
   test: ^0.12.33
+  file_testing: '>=2.0.0 <3.0.0'
 
 environment:
   sdk: '>=2.0.0-dev.28.0 <2.0.0'
diff --git a/test/chroot_test.dart b/packages/file/test/chroot_test.dart
similarity index 98%
rename from test/chroot_test.dart
rename to packages/file/test/chroot_test.dart
index 044f489..cd9f1a1 100644
--- a/test/chroot_test.dart
+++ b/packages/file/test/chroot_test.dart
@@ -9,7 +9,7 @@
 import 'package:file/file.dart';
 import 'package:file/local.dart';
 import 'package:file/memory.dart';
-import 'package:file/testing.dart';
+import 'package:file_testing/file_testing.dart';
 import 'package:test/test.dart';
 
 import 'common_tests.dart';
diff --git a/test/common_tests.dart b/packages/file/test/common_tests.dart
similarity index 99%
rename from test/common_tests.dart
rename to packages/file/test/common_tests.dart
index d1746c6..3227856 100644
--- a/test/common_tests.dart
+++ b/packages/file/test/common_tests.dart
@@ -8,7 +8,7 @@
 import 'dart:io' as io;
 
 import 'package:file/file.dart';
-import 'package:file/testing.dart';
+import 'package:file_testing/file_testing.dart';
 import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 import 'package:test/test.dart' as testpkg show group, setUp, tearDown, test;
diff --git a/test/local_test.dart b/packages/file/test/local_test.dart
similarity index 98%
rename from test/local_test.dart
rename to packages/file/test/local_test.dart
index 3cfdf08..b9307c9 100644
--- a/test/local_test.dart
+++ b/packages/file/test/local_test.dart
@@ -6,7 +6,7 @@
 import 'dart:io' as io;
 
 import 'package:file/local.dart';
-import 'package:file/src/testing/internal.dart';
+import 'package:file_testing/src/testing/internal.dart';
 import 'package:test/test.dart';
 
 import 'common_tests.dart';
diff --git a/test/memory_test.dart b/packages/file/test/memory_test.dart
similarity index 100%
rename from test/memory_test.dart
rename to packages/file/test/memory_test.dart
diff --git a/lib/src/testing/record_replay_matchers.dart b/packages/file/test/record_replay_matchers.dart
similarity index 98%
rename from lib/src/testing/record_replay_matchers.dart
rename to packages/file/test/record_replay_matchers.dart
index 021940d..7a3b2f1 100644
--- a/lib/src/testing/record_replay_matchers.dart
+++ b/packages/file/test/record_replay_matchers.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:file/record_replay.dart';
-import 'package:file/src/backends/record_replay/common.dart' hide TypeMatcher;
+import 'package:file/src/backends/record_replay/common.dart'
+    show getSymbolName; // ignore: implementation_imports
 import 'package:test/test.dart';
 
 const Map<Type, String> _kTypeDescriptions = const <Type, String>{
diff --git a/test/recording_test.dart b/packages/file/test/recording_test.dart
similarity index 99%
rename from test/recording_test.dart
rename to packages/file/test/recording_test.dart
index 8007cbf..034f43c 100644
--- a/test/recording_test.dart
+++ b/packages/file/test/recording_test.dart
@@ -8,16 +8,17 @@
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
 import 'package:file/record_replay.dart';
-import 'package:file/testing.dart';
 import 'package:file/src/backends/record_replay/codecs.dart';
 import 'package:file/src/backends/record_replay/common.dart';
 import 'package:file/src/backends/record_replay/events.dart';
 import 'package:file/src/backends/record_replay/mutable_recording.dart';
 import 'package:file/src/backends/record_replay/recording_proxy_mixin.dart';
+import 'package:file_testing/file_testing.dart';
 import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 
 import 'common_tests.dart';
+import 'record_replay_matchers.dart';
 
 void main() {
   group('SupportingCode', () {
diff --git a/test/replay_test.dart b/packages/file/test/replay_test.dart
similarity index 98%
rename from test/replay_test.dart
rename to packages/file/test/replay_test.dart
index 4b2ea18..b059356 100644
--- a/test/replay_test.dart
+++ b/packages/file/test/replay_test.dart
@@ -7,11 +7,12 @@
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
 import 'package:file/record_replay.dart';
-import 'package:file/testing.dart';
+import 'package:file_testing/file_testing.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import 'common_tests.dart';
+import 'record_replay_matchers.dart';
 
 void main() {
   group('Replay', () {
diff --git a/test/utils.dart b/packages/file/test/utils.dart
similarity index 100%
rename from test/utils.dart
rename to packages/file/test/utils.dart
diff --git a/test/utils_test.dart b/packages/file/test/utils_test.dart
similarity index 100%
rename from test/utils_test.dart
rename to packages/file/test/utils_test.dart
diff --git a/packages/file_testing/CHANGELOG.md b/packages/file_testing/CHANGELOG.md
new file mode 100644
index 0000000..a32fe8b
--- /dev/null
+++ b/packages/file_testing/CHANGELOG.md
@@ -0,0 +1,9 @@
+#### 2.0.0
+
+* Removed `record_replay_matchers.dart` from API
+
+#### 1.0.0
+
+* Moved `package:file/testing.dart` library into a dedicated package so that
+  libraries don't need to take on a transitive dependency on `package:test`
+  in order to use `package:file`.
diff --git a/LICENSE b/packages/file_testing/LICENSE
similarity index 100%
copy from LICENSE
copy to packages/file_testing/LICENSE
diff --git a/packages/file_testing/README.md b/packages/file_testing/README.md
new file mode 100644
index 0000000..ca6c652
--- /dev/null
+++ b/packages/file_testing/README.md
@@ -0,0 +1,32 @@
+# file_testing
+
+Testing utilities intended to work with `package:file`
+
+## Features
+
+This package provides a series of matchers to be used in tests that work with file
+system types.
+
+## Usage
+
+```dart
+import 'package:file/file.dart';
+import 'package:file_testing/file_testing.dart';
+import 'package:test/test.dart';
+
+test('some test', () {
+  MemoryFileSystem fs;
+
+  setUp(() {
+    fs = new MemoryFileSystem();
+    fs.file('/foo').createSync();
+  });
+
+  expectFileSystemException(ErrorCodes.ENOENT, () {
+    fs.directory('').resolveSymbolicLinksSync();
+  });
+  expect(fs.file('/path/to/file'), isFile);
+  expect(fs.file('/path/to/directory'), isDirectory);
+  expect(fs.file('/foo'), exists);
+});
+```
diff --git a/lib/testing.dart b/packages/file_testing/lib/file_testing.dart
similarity index 86%
rename from lib/testing.dart
rename to packages/file_testing/lib/file_testing.dart
index 178711a..35fcdac 100644
--- a/lib/testing.dart
+++ b/packages/file_testing/lib/file_testing.dart
@@ -4,4 +4,3 @@
 
 /// Matchers (from `package:test`) for use in tests that deal with file systems.
 export 'src/testing/core_matchers.dart';
-export 'src/testing/record_replay_matchers.dart';
diff --git a/lib/src/testing/core_matchers.dart b/packages/file_testing/lib/src/testing/core_matchers.dart
similarity index 98%
rename from lib/src/testing/core_matchers.dart
rename to packages/file_testing/lib/src/testing/core_matchers.dart
index 6ca3388..58e11d3 100644
--- a/lib/src/testing/core_matchers.dart
+++ b/packages/file_testing/lib/src/testing/core_matchers.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:file/file.dart';
+import 'dart:io';
+
 import 'package:test/test.dart';
 
 import 'internal.dart';
diff --git a/lib/src/testing/internal.dart b/packages/file_testing/lib/src/testing/internal.dart
similarity index 100%
rename from lib/src/testing/internal.dart
rename to packages/file_testing/lib/src/testing/internal.dart
diff --git a/packages/file_testing/pubspec.yaml b/packages/file_testing/pubspec.yaml
new file mode 100644
index 0000000..fa33945
--- /dev/null
+++ b/packages/file_testing/pubspec.yaml
@@ -0,0 +1,13 @@
+name: file_testing
+version: 2.0.0
+authors:
+- Todd Volkert <tvolkert@google.com>
+description: Testing utilities for package:file
+homepage: https://github.com/google/file.dart/packages/file_testing
+
+dependencies:
+  meta: ^1.1.2
+  test: ^0.12.33
+
+environment:
+  sdk: '>=2.0.0-dev.28.0 <2.0.0'