【问题标题】:How to manage Tcl packages, considering that pkg_mkindex is deprecated?考虑到 pkg_mkindex 已被弃用,如何管理 Tcl 包?
【发布时间】:2014-10-04 12:58:16
【问题描述】:

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

现在,“已弃用”的意思是“已被一种新的、更好的方法所取代,旧的方法不应再用于新项目”。

但是,我遇到的唯一替代建议是手动创建 pkgIndex.tcl 文件,这在我看来不像是包创建方面的进步。

那么,给有经验的 Tcl 开发人员一个问题:那么,如果 pkg_mkindex 是不应该再使用的东西,你如何管理包?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    对于大多数包作者来说,在您开始编写包时运行一次根本不是问题。但是它生成的脚本(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,这绝对不适合所有人……)

    【讨论】:

      【解决方案2】:

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

      有些人想弃用它,同样是 AFAICT,部分原因是它使用了一种相当幼稚的方法(这总是不是一件坏事),部分原因是现在图书馆需要的不仅仅是整理source 的哪些文件才能正确安装。

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

      (如果您能够编写比pkg_mkIndex 处理的更复杂的库,那么提供手写索引文件是轻而易举的事。但可能仍然有可用的更新工具。)

      ETA:我的个人解决方案(可能会发生变化,我每隔几个月修改一次设置)是在我的工作目录的姊妹目录中拥有我经常编辑的库文件(其中大部分是)。在每个工作目录中,我都有一些 scriptlet,它们可以执行诸如运行测试套件、动态创建 session.vim 文件并启动 gVim 以及修订控制我的文件之类的操作。所有这些 scriptlet 都提供了一个 mini-scriptlet,它为库目录编制索引并将其添加到 auto_path。库文件只是 .tcl 文件,其中包含 package provide。我将那些“完成”的几个库重写为模块并复制到我的C:\Tcl\lib\tcl8\8.6 目录中。

      文档:auto_pathpackagepkg_mkIndex

      【讨论】:

      • 对于单文件包,8.5已经引入了Tcl模块,不需要任何pkgIndex.tcl文件。
      • @schlenk:好点。模块管理虽然简单,但需要进一步简化。
      • 同意,模块的管理还不完善,而且缺少公共开放存储库(除了 ActiveState 茶壶),也有点遗憾。但至少它不是像 python 包装那样的火车残骸,它每隔几个月就会改变一次。一个主要缺乏的东西是包和模块的任何形式的依赖管理。
      • @user1934428:嗯,数据不足。从您的应用程序调用pkg_mkIndex 本身不是问题,只要您不索引调用pkg_mkIndex 的脚本所在的目录(这只是一个无限递归问题)。索引项目树中的每个目录真的有用吗?为了从中受益,您需要将这些目录放在您的库路径中。 (也许我没有正确理解你。)添加了我自己的设置进行比较。
      • pkgIndex.tcl 脚本中的dir 不是全局变量;脚本在本地环境中进行评估。
      猜你喜欢
      • 2014-06-23
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 2018-12-12
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多