考虑到不推荐使用pkg_mkindex,如何管理Tcl包?

时间:2014-10-04 12:58:16

标签: tcl

我很惊讶地发现,pkg_mkindex已被弃用(http://wiki.tcl.tk/3388),甚至是危险的(http://wiki.tcl.tk/3382)。

现在,'弃用'意味着“已经被一种新的,更好的方法取代,旧的方法不再用于新项目”。

然而,我遇到的唯一替代建议是手工创建pkgIndex.tcl文件,这对我来说并不像包装创建方面的进步。

那么,对经验丰富的Tcl开发人员提出一个问题:如果pkg_mkindex不再使用,那么你如何管理包呢?

2 个答案:

答案 0 :(得分:2)

对于大多数软件包作者来说,当你开始编写软件包时,运行一次根本不是问题。但它生成的脚本(在pkgIndex.tcl中)非常简单,你可以通过调整脚本来满足自己的实际需求,从而做得更好。

幸运的是,如果您使用的是Tcl 8.5或更高版本,则可以使用apply来简化操作。这意味着您可以像这样生成脚本:

### Read this as if it is:
#### package ifneeded $pkg $version [list apply {dir $thescript} $dir]
package ifneeded MyFunkyPackage 1.2.3 [list apply {dir {
    # Work out the right binary library name
    switch $tcl_platform(platform) {
        windows { set lib MFP123.DLL }
        default { set lib libMFP.1.2.3[info sharedlibextension] }
    }
    load [file join $dir $lib] MFP
    # Source a bunch of scripts with their encodings forced to UTF-8
    foreach script [glob -directory $dir MFP*.tcl] {
        source -encoding utf-8 $script
    }
}} $dir]

好吧,这是一个非常花哨的包定义脚本,但是做任何其他方式都很尴尬 - 用双引号字符串构建脚本会很痛苦,也可能容易出错 - 而且但这里很简单,因为你有局部变量,结构化编程结构,作品。 (你也可以通过在configure期间生成正确的东西来做到这一点,假设你正在遵循TEA模型,但这需要你很高兴用autoconf进行攻击,这绝对不适合所有人......)

答案 1 :(得分:1)

AFAICT针对Tcl 9讨论了一个改进的解决方案。(请注意,它不是正式弃用。)

有些人想再次弃用AFAICT,部分原因是因为它使用了一种相当天真的方法(这不是总是是坏事),部分是因为现在图书馆需要的不仅仅是整理出要正确安装source的文件。

它对于业余级包管理仍然有用:只要您编写直接,简单的Tcl脚本索引并避免索引要调用的目录pkg_mkIndex,它就能完成这项工作。

(如果你能够编写比pkg_mkIndex更复杂的库,那么提供一个手写的索引文件是轻而易举的。但是应该仍然可以使用更新的工具。)

ETA:我的个人解决方案(可能会有变化,我每隔几个月修改一下我的设置)就是在我的工作目录的姐妹目录中经常编辑我的库文件(大部分都是这样)。在每个工作目录中,我都有脚本,可以运行测试套件,动态创建session.vim文件并启动gVim,并修改控制我的文件。所有这些scriptlet都会提供一个迷你scriptlet,它将库目录编入索引并将其添加到auto_path。库文件只是.tcl文件,其中包含package provide。那些“完成”的库我重写为模块并复制到我的C:\Tcl\lib\tcl8\8.6目录中。

文档:auto_pathpackagepkg_mkIndex