The user guide (56.9. Decoupled Projects) mentions avoiding using coupled projects because it prevents Gradle “from substituting a pre-built artifact in place of a project dependency”. Is substitution of pre-built artifacts a core feature of Gradle? I have not found any other references to this.
Independently, I put together a method to do substitution by essentially defining configurations then declaring their dependencies (project vs artifact) based on a passed in project property, but would prefer to use a native method if there is a more elegant one.