Tcl包介绍

Tcl中提供了一种类似其他编程语言的代码复用机制----包(packages)。可以把一些需要重复使用的代码放入包中,在需要使用的地方导入就可以直接使用了。当然,也可以使用source方式复用代码,但是source是直接把所有文件代码导入的,存在效率上的问题(未测试过,官方这么说的)。
packages常用的放置位置:tcl_pkgPathauto_path两个参数可以当前系统的包位置。

创建package的三步:

  • 在脚本中添加package provide描述
  • 创建一个pkgIndex.tcl文件
  • 安装包到Tcl能找到的位置

package provide命令放在脚本开头,告诉Tcl此包的名字和版本。
pkgIndex.tcl文件告诉Tcl如何加载包。最好的加载方式应该使用package ifneeded命令,告诉Tcl的解释器,只有当需要使用的时候才加载,不用像source一样完全载入。可以使用pkg_mkIndex命令创建pkgIndex.tcl文件。
当包索引(pkgIndex.tcl)创建完成后,把包(其实是包含pkgIndex.tcl和脚本的文件夹)放入Tcl能搜索到的目录。即放置到tcl_pkgPathauto_path目录下,或者也可以使用lappend ::auto_path /path/to/new/directory命令把其他目录添加到auto_path中,让tcl能查找到。

  • package require ?-exact? name ?version?
    根据name加载某个包。如果-exact后面跟着具体的version号,则只会加载对应的版本号。如果只写了version,没有-exact,则会加载大于等于此version的包。如果没有version,则会加载任何包。如果一个包匹配了,则会加载此包,并返回版本。
  • package provide name ?version?
    告诉Tcl此包的名字和版本号
  • pkg_mkIndex ?-direct? ?-lazy? ?-load pkgPath? ?-verbose? dir ?pattern pattern ...?
    创建一个pkgIndex.tcl脚本

举例:

  • 创建脚本
    package provide mypackage 1.0
    namespace eval mypackage {}
    proc mypackage::add {a b} {
      return [expr {$a + $b}]
    }
  • 使用pkg_mkIndex命令创建pkgIndex.tcl文件(注意:pkg_mkIndex命令需要进入tclsh环境执行)
    方式一:直接在文件夹中执行,其中"."表示为当前目录
    % pkg_mkIndex . *.tcl *.so
    方式二:使用文件夹作为参数
    % gpk_mkIndex /path/to/script/directory
  • 把文件夹放置到auto_pathtcl_pkgPath中,并执行package require mypackage查询包是否存在,如果存在则返回包版本
    %package require mypackage
    %1.0

    以上命令会在/path/to/script/directory目录下创建pkgIndex.tcl文件。每当改变包名字或版本或文件名的时候都需要使用pkg_mkIndex命令重新创建下包。

参考文档:
namespace和package官方文档:http://www.tcl.tk/man/tcl8.5/tutorial/Tcl31.html
package详细文档:http://www.tcl.tk/man/tcl/TclCmd/package.htm

Tcl包介绍》上有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注