You add json_serializable , run dart run build_runner build , and get: Conflicting outputs were detected and the build will be terminated. You run it with --delete-conflicting-outputs , it works, and you type that flag forever afterwards without knowing what it deleted. That is the typical relationship developers have with build_runner, and it is worth fixing, because the tool is more predictable than it looks. The model: one asset in, one asset out build_runner is not a script runner. It is a build system over assets — files identified as package:name|path . Every builder declares which extensions it consumes and which it produces, and build_runner constructs a graph from that. json_serializable says: for every .dart , maybe produce a .g.dart . freezed says: for every .dart , maybe produce a .freezed.dart . Because outputs are keyed by path, two builders that claim the same output path conflict — and so does one builder whose previous output is still on disk from a run with d...