我会用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]]
这种模式可能是有用的,如果子组件可能是对自己有帮助的,或者它可能是很方便的只有某些部分加载到插补。 tcllib SASL软件包可以避免在默认情况下加载某些机制(例如NTLM)。
非常感谢。你的解决方案非常完美!只是最后一件事。我仍然试图创建一个命名空间集合。我将'包放在需要的地方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]; \ namespace eval {namespace ensamble create}; \ package provides 0.1]'但它不起作用(我的意思是整体不起作用) 。它仅将第一个包中的proc识别为子命令。 –
2012-02-21 11:44:39