Tcl-将软件包拆分为几个文件,它们之间具有依赖关系

时间:2018-08-19 07:47:25

标签: package tcl

我是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”操作。
问题是我在任何地方都找不到解释该操作方法的示例/网站。

2 个答案:

答案 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,所以我不知道我是否在这里处理它。

这样做的目的是我想要

  1. pkgIndex.tcl尽可能简单
  2. 整个shebang尽可能容易加载(此处为一个package require
  3. 编写的部分(系统和子系统)就像是main.tcl的一部分一样,只是为了清楚起见而分开放在自己的文件中
  4. 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在这里不是必需的:它是在加载模块时自动完成的。

这样做的目的是我想要

  1. 避免维护最新的pkgIndex.tcl

  2. 零件尽可能地独立

  3. 每个部分都表达了其工作所需的条件

答案 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文件,只是通过确实的命令使其成为可能。