2014-10-05 57 views
1

我Tcl的項目庫已在樹這樣的組織:的Tcl中:namespace eval裏命名進口

MYLIB:Base文件夾(具有一定的TCL)文件
MYLIB /富,MYLIB /條(子目錄與其他一些Tcl文件)。

我特別有MYLIB /富/ mc.tcl,提供一攬子三菱商事與名

# File mc.tcl 
namespace eval ::mc { 
    namespace export dance&sing 
} 
proc ::mc::dance&sing { {s {Oh Tannenbaum} } } { puts "$s,...." } 
package provide mc 1.4 

效果很好。現在我加入MYLIB /酒吧/ by.tcl,提供了一個命名空間:通過使用封裝MC:

# file by.tcl 
package require mc 
namespace eval ::by {} 
proc ::by::execute {} { 
    ::mc::dance&sing "Sushi&more" 
} 
package provide by 1.1 

到目前爲止,一切工作爲做廣告。現在我想(作爲練習)通過從mc導入導出的符號來更改by.tcl。這是我的變化:

namespace eval ::by { 
    namespace import ::mc::dance&sing 
} 

當通過pkg_mkIndex運行修改後的文件,我發現所得將pkgIndex.tcl不包含包通過,這通常是一個標誌的條目,有一些錯誤的tcl文件。但是,我可以執行by.tcl而不會收到錯誤消息。如果我的設計中存在錯誤,它必須更加微妙。

我的TCLLIBPATH環境變量僅包含基本文件夾mylib(當然是絕對路徑)。這應該不成問題,因爲這些包的文件是遞歸地找到的。

有什麼想法在這裏出了什麼問題?

我加了一個例子重現問題

這裏是你如何重現它:

(1)下載http://files.ronaldf.eml.cc/stovfl0.tgz然後解壓到某個目錄 (2)確保慶典(或zsh中)和tclsh時,在你的PATH (3)CD到您解包一切的目錄,並且像這樣運行:

bash ./run-it.sh 

你應該看到類似的輸出到這一點:

pkg_mkIndex for directory ....stovfl0/mylib/foo 
pkg_mkIndex for directory ....stovfl0/mylib/bar 

(4)貓MYLIB /酒吧/將pkgIndex.tcl

你會發現,這包 '由' 缺少。

+1

無法重現,抱歉。有沒有其他的東西可以同時改變? – 2014-10-05 11:49:10

+0

我已經在8.4和8.6中試過了,我無法複製;在這兩種情況下,我都得到了正確的'pkgIndex.tcl'。 ___確切地說你正在調用'pkg_mkIndex'嗎?你使用的是什麼確切版本的Tcl? – 2014-10-05 20:26:55

+0

在這種情況下,我使用的是Mac OSX Snow Leopard的Tcl 8.5。我cd'd到目錄,並調用了「pkg_mkIndex。」的Tcl腳本。當我註釋掉命名空間導入時,它可以工作。當我取消註釋時,它停止工作。我會嘗試在不同的平臺上重現它,但是由於每個人都確信這應該起作用,所以我懷疑我一定犯了一些嚴重的錯誤。我會在這裏發佈我的發現,如果我真的可以在特定的平臺上進行復制(本週沒有訪問Mac),我會上傳一個zip壓縮文件,以便您可以在系統上嘗試它。 – user1934428 2014-10-06 09:00:01

回答

1

無論出錯是相當神祕的。當我在一個新的空目錄中創建以下兩個文件:

# mc.tcl 
namespace eval ::mc { 
    namespace export dance&sing 
} 
proc ::mc::dance&sing { {s {Oh Tannenbaum} } } { puts "$s,...." } 
package provide mc 1.4 
# by.tcl 
package require mc 
namespace eval ::by {} 
proc ::by::execute {} { 
    namespace import ::mc::dance&sing 
    ::mc::dance&sing "Sushi&more" 
} 
package provide by 1.1 

然後我去與tclsh8.5(雪豹系統構建)該目錄中,並執行這個Tcl命令:

pkg_mkIndex . *.tcl 

然後我得到創造了這個包索引文件,這是正確的

# Tcl package index file, version 1.1 
# This file is generated by the "pkg_mkIndex" command 
# and sourced either when an application starts up or 
# by a "package unknown" script. It invokes the 
# "package ifneeded" command to set up package-related 
# information so that packages will be loaded automatically 
# in response to "package require" commands. When this 
# script is sourced, the variable $dir must contain the 
# full path name of this file's directory. 

package ifneeded by 1.1 [list source [file join $dir by.tcl]] 
package ifneeded mc 1.4 [list source [file join $dir mc.tcl]] 

我得到一模一樣當我使用Tcl的8.4或8.6的Tcl。