Я бы использовал файл pkgIndex, чтобы получить исходные файлы для вашего пакета.Это загрузит все.Затем объявите ансамбль, как только интерпретатор загрузит все.
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"
Не «предоставлять» в каждом подкомпоненте.Лучше предоставить пакет, как только все будет успешно загружено в интерпретатор, поэтому я сделаю это в конце файла, или в этом случае и в конце загрузки полного набора.Если вы действительно хотите рассматривать каждую часть как подпакет, то нет причин не объявлять их как подпакеты, поскольку для основного пакета требуется каждый подпакет.Например:
<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]]
Эта модель может быть полезна, если подкомпоненты могут быть полезны сами по себе или если было бы удобно загружать только определенные части в interp.Пакет tcllib SASL делает это, чтобы избежать загрузки некоторых механизмов по умолчанию (например, NTLM).