I would use the pkgIndex file to source all the constituent files for your package. That will load everything up. Then declare the ensemble once the interpreter has everything loaded.
package ifneeded Mypackage 1.2.3 \
"source \[file join [list $dir] pkg-part1.tcl\] ; \
source \[file join [list $dir] pkg-part2.tcl\] ; \
namespace ensemble create {...} ; \
package provide Mypackage 1.2.3"
Don't 'provide' in each sub-component. Its better to provide the package once everything was successfully loaded into the interpreter so I'd do that at the end of the file, or in this case and the end loading the full set. If you really want to treat each part as a subpackage, there is no reason not to declare them as subpackages, with a master package that requires each subpackage. eg:
<main package>
package require Package::part1
package require Package::part2
package provide Package 1.0
<subpackage files>
namespace eval Package {
... stuff ...
}
... more stuff ...
package provide Package::partN 1.0
<pkgIndex.tcl>
package ifneeded Package::part1 1.0 [list source [file join $dir part1.tcl]]
package ifneeded Package::part2 1.0 [list source [file join $dir part2.tcl]]
package ifneeded Package 1.0 [list source [file join $dir package.tcl]]
This model can be useful if the sub-components might be helpful on their own or if it might be handy to only load certain parts into an interp. The tcllib SASL package does this to avoid having some mechanisms loaded by default (eg NTLM).