我是tcl / itcl的初学者,正在尝试创建一个软件包。
问题是我的软件包中的文件相互依赖。
例如:
pkgIndex.tcl
package ifneeded test 1.0 [list ::apply {dir {
package require Itcl
namespace eval ::test {
namespace export *
variable version 1.0
}
source [file join $dir system.itcl]
source [file join $dir subsystem.itcl]
package provide test 1.0
}} $dir]
system.itcl
itcl::class ::test::system {
...
private variable _subsystems ""
...
constructor {} { lappend _subsystems [::test::subsystem #auto] }
...
}
subsystem.itcl
itcl::class ::test::subsystem {
...
private variable data ""
...
constructor {} { set data "new data" }
...
}
在这种情况下,我应该在system.itcl中包含subsystem.itcl文件。
如果我不提供软件包,我会使用source命令,但我读到,提供软件包时,您不会使用source命令,而是有其他方法可以执行“ include”操作。
问题是我在任何地方都找不到解释该操作方法的示例/网站。
答案 0 :(得分:1)
我会这样做:
(在这种情况下,系统和子系统不是软件包:请参见下文)
( DIR 是$auto_path
中的目录或添加到其中的目录)
DIR /pkgIndex.tcl
package ifneeded test 1.0 [list source [file join $dir test.tcl]]
DIR /test.tcl
package require Itcl
set dir [file dirname [file normalize [info script]]]
source [file join $dir subsystem.itcl]
source [file join $dir system.itcl]
namespace eval ::test {
namespace export *
variable version 1.0
}
package provide test $::test::version
DIR /system.itcl
itcl::class ::test::system {
...
private variable _subsystems ""
...
constructor {} { lappend _subsystems [::test::subsystem #auto] }
...
}
DIR /subsystem.itcl
itcl::class ::test::subsystem {
...
private variable data ""
...
constructor {} { set data "new data" }
...
}
请注意,我不使用Itcl,所以我不知道我是否在这里处理它。
这样做的目的是我想要
pkgIndex.tcl
尽可能简单package require
)main.tcl
的一部分一样,只是为了清楚起见而分开放在自己的文件中main.tcl
表示有关代码各部分之间如何相互连接的所有信息如果系统和子系统应该是软件包,我会这样做:
( DIR 是[::tcl::tm::path list]
中的目录或添加到其中的目录)
DIR /test-1.0.tm
package require test::system
namespace eval ::test {
namespace export *
variable version 1.0
}
DIR /test/system-1.0.tm
package require Itcl
package require test::subsystem
itcl::class ::test::system {
...
private variable _subsystems ""
...
constructor {} { lappend _subsystems [::test::subsystem #auto] }
...
}
DIR /test/subsystem-1.0.tm
package require Itcl
itcl::class ::test::subsystem {
...
private variable data ""
...
constructor {} { set data "new data" }
...
}
请注意,package provide
在这里不是必需的:它是在加载模块时自动完成的。
这样做的目的是我想要
避免维护最新的pkgIndex.tcl
零件尽可能地独立
每个部分都表达了其工作所需的条件
答案 1 :(得分:0)
好的。我以下面的方式做到了,而且有效。
pkgIndex.tcl
package ifneeded test 1.0 [list source [file join $dir test.tcl]]
package ifneeded system 1.0 [list source [file join $dir system.itcl]]
package ifneeded subsystem 1.0 [list source [file join $dir subsystem.itcl]]
test.tcl
package require ::test::system
namespace eval ::test {
namespace export *
variable version 1.0
}
package provide test 1.0
system.itcl
package require ::test::subsystem
package require Itcl
itcl::class ::test::system {
...
private variable _subsystems ""
...
constructor {} { lappend _subsystems [::test::subsystem #auto] }
...
}
package provide ::test::system 1.0
subsystem.itcl
package require Itcl
itcl::class ::test::subsystem {
...
private variable data ""
...
constructor {} { set data "new data" }
...
}
package provide ::test::subsystem 1.0
所以每个文件都为我提供了不同的程序包,并且需要使用不同的程序包和pkgIndex文件,只是通过确实的命令使其成为可能。