软件包 tdbc::mysql 和 tdbc::postgresql 需要 DLL libmysql.dll 和 libpq.dll 在 PATH 中。将此 dll 包含到单个 starpack 中的最佳方法是什么?
现在我正在使用以下 pkgIndex.tcl:
if {[catch {package require Tcl 8.6}]} {
return
}
package ifneeded tdbc::postgres 1.0.0 [list apply {{dir} {
if { $::tcl_platform(os) eq "Windows NT" &&
($::tcl_platform(machine) eq "intel" ||
$::tcl_platform(machine) ne "amd64") } {
foreach n {libpq libeay32 ssleay32 comerr32 gssapi32
k5sprt32 krb5_32 libiconv-2 libintl-8} {
file copy -force [file join $dir ${n}.dll] \
[file join $::env(WINDIR) System32 ${n}.dll]
}
}
source [file join $dir tdbcpostgres.tcl]
load [file join $dir tdbcpostgres100.dll] tdbcpostgres
}} $dir]
但这看起来非常难看。
我试图找到一种方法将必要的库复制到解释器用来加载 dll 的临时文件夹中。但是通过检查 Tcl 源代码,发现临时目录的名称是不可能用于脚本的。
更新:目前,我决定使用 twapi 来确定 Tcl 解释器使用的临时文件夹的名称。我得到以下代码:
if {[catch {package require Tcl 8.6}]} {
return
}
package ifneeded tdbc::postgres 1.0.0 [list apply {{dir} {
if { $::tcl_platform(os) eq "Windows NT" &&
($::tcl_platform(machine) eq "intel" ||
$::tcl_platform(machine) eq "amd64") } {
package require twapi
set _ [file dirname [lindex [lsearch -inline -index 1 -glob \
[twapi::get_process_modules [twapi::get_current_process_id] -path] \
{*/twapi_base*.dll}] 1]]
if { $_ eq "." } {
error "couldn't find temp folder name for tdbc::postgres support library"
}
foreach fn [glob -types f -tails -directory $dir "*.dll"] {
if { [string match -nocase "tdbcpostgres*" $fn] } continue
file copy -force [file join $dir $fn] [file join $_ $fn]
}
} {
set _ [pwd]
}
source [file join $dir tdbcpostgres.tcl]
set tpwd [pwd]
cd $_
catch { load [file join $dir tdbcpostgres100.dll] tdbcpostgres } r o
cd $tpwd
return -options $o $r
}} $dir]
但是程序退出后删除临时文件仍然存在问题。我只看到一个解决方案:在程序开始时扫描文件夹$::env(TEMP)
并尝试删除所有名为TCLXXXXXXXX
.