Hi Jeremy, fancy seeing you here! Thanks for taking the time to help me out.
From everything I've read thus far, my overall inclination is towards having one package, with multiple products, each with one main target (and a test target, optionally a UI test target, etc.). I'll describe my rationale below. Could you let me know if it sounds reasonable?
I guess in some sense, there's no real versioning beyond the git commit sha. E.g. I don't intended to bump the semantic versioning numbers with every feature or code change I make, since the sole intended consumer of these components is the main app that glues them together (which resides in the same repo). If I'm not mistaken, that points me away from the need to have multiple packages.
Ah products. I forgot to mention those in my post. From what I gather, dependency resolution and fetching is done on a package as a whole. I.e. you can't cherry pick a single products' source files out of a package. For that, you would promote the product into its own new swift package. Is that correct?
I'm not sure, that sounds like a style/best-practice thing, and I don't know what the current convention is. Do I want:
import MyAppAllTheThings
or...
import MyAppNetworking
import MyAppCollections
import MyAppUtils
// and so on...

There's some "components" (my generic term for my yet-undecided unit of modularity) that seem reasonably reusable (utils, collections, algorithms, Swifty wrappers around old APIs, etc.), and some that are intentionally quite specific to the particular app (UIs, data models, etc.)
If I go with "1 package, multiple products" today, and I decide in the future that I want to reuse some library (e.g. MyAppUtils) in other projects, I can just promote that product into new a package, and all my existing sources wont' need to be changed, since they already had import MyAppUtils.
That seems undesirable to me. Using internal APIs of another component is basically subverting the explicit dependency boundaries I'm trying to establish. Right?