是否可以有条件地包含软件包?

时间:2019-06-20 15:40:08

标签: tcl

使用C中的示例将更容易解释。当您使用C(或C ++等)构建应用程序时,可以构建一个“发行版”,其中不包含无发行版中的某些代码。一。例如:测试代码等。

我正在尝试在TCL中做类似的事情。我们有一些跟踪函数,当我处于“发行”状态时,我希望它们是空壳。

所以我想我可以使用两种不同的软件包来做到这一点,并在发行版中使用一个,而在设计人员中使用一个,以便设计人员可以使用“ define”或类似名称。

我知道我也可以使用“重命名”和“别名”“替换”每个函数,但是我的应用程序启动了多个线程(每个线程有一个解释器),因此我将不得不在多个线程中替换多个函数,我认为事情比较复杂。我以为使用两个不同的程序包可以“一劳永逸地解决所有问题”。

谢谢

1 个答案:

答案 0 :(得分:1)

最简单的技术之一是在软件包的pkgIndex.tcl脚本中添加一些额外的魔术。通常看起来像(cookiejar是我在8.7中写的一个小程序包):

package ifneeded cookiejar 0.1 [list source [file join $dir cookiejar.tcl]]

但是,如果您想使条件更具条件,可以改为:

if {[info exist ::developermode]} { # Or however you want to detect it!
    package ifneeded cookiejar 0.1 [list source [file join $dir cookiejar-dev.tcl]]
} else {
    package ifneeded cookiejar 0.1 [list source [file join $dir cookiejar-release.tcl]]
}

然后,您可以有两个实现,一个是开发版本,另一个是发行版本。在您的情况下,发行版可能只是提供相同API但无所作为的函数中的空白部分。 (您根本无法提供任何命令,也不能使事情前后矛盾,但这很可能导致在开发中起作用的代码无法进行生产。)


如果有帮助,请注意,如果您定义这样的过程:

proc someCommand {args} {}

(也就是说,它仅将args作为其正式参数,并且具有一个空主体。)然后Tcl将使该过程从使用它的过程的运行时字节码中完全删除。这可能对您非常有用;它使您的生产代码可以引用调试助手,而无需付出任何(有意义的)代价。