我試圖找出一個進程屬於這樣我就可以驗證該包的版本TCL包名
說我有包包
some::package 1.0
其中有一個PROC
some::package::some_proc
給予一定::包裝:: some_proc我希望能夠得到1.0
我不能保證該命名空間具有相同的名稱作爲包屬於
任何幫助,不勝感激
我試圖找出一個進程屬於這樣我就可以驗證該包的版本TCL包名
說我有包包
some::package 1.0
其中有一個PROC
some::package::some_proc
給予一定::包裝:: some_proc我希望能夠得到1.0
我不能保證該命名空間具有相同的名稱作爲包屬於
任何幫助,不勝感激
您正在尋找namespace current
:
% namespace eval some::package {
proc some_proc {} { puts [namespace current] }
}
% some::package::some_proc
::some::package
從技術上講,你不能做到這一點沒有提供自己的package require
版本。 Tcl中的命名空間和包和文件沒有鏈接,就像它們在Python或Java中一樣。
如果您知道所有過程都是靜態定義的(例如,沒有動態代碼生成),您可以用您自己的版本代替package require
,並在調用之前和之後列舉所有過程,並將這些名稱放在某個註冊表中。
你想驗證什麼?
如果您想驗證某種API,您可以查看Tcllib中的pluginmgr軟件包。
嗨,這是一個有趣的方法,我在我的pkgIndex.tcl中做了類似的事情。我有一個我寫的tcl rpc服務器,位於一個大型的傳統tcl庫上。我想驗證pkg版本是否一致。因此,試圖找出哪些程序包已加載給定proc名稱。我會看看pluginmgr。非常感謝 –
傳統,但不是普遍,從包含相關命令的命名空間的名稱得到一個包的名稱:
set pkg [namespace qualifiers [namespace which $theCommand]]
# Be aware, this produces the empty string for global commands
但是,並非所有的軟件包做到這一點;一些較舊的軟件包不會將其公共命令放入命名空間(出於歷史/後向兼容性原因)。在這種情況下,搜索文檔是唯一可以做的事情。
一旦你得到了軟件包名稱,即可確定包的當前加載版本package present
:
set version [package present $pkg]
這隻能如果程序包以前曾package require
d,當然。您還可以使用package versions
來確定您的環境中有哪些其他版本的軟件包可用;儘管Tcl只會將一個版本的軟件包加載到解釋器上下文中,但您可以安裝許多不同的軟件包,而不必(不一定)出現問題。
請注意,一次加載多個版本可能會導致您遇到實際問題;在Tomcat或OSGi等環境中,Java庫JAR可能會發生這種情況,並且在發生錯誤時進行調試會非常複雜。(它幾乎工作,除了東西最終會給出錯誤,看起來完全沒有意義,像「無法處理'foo.Bar':預計'foo.Bar'而不是」。) –
嗨,我有一個戲劇,它確實工作對於與名稱空間名稱相同的那些包。雖然不是如果他們不同。我將看看下面提到的有關重新編寫包的需求,以便在加載它時存儲有關包的信息。謝謝你的幫助 –
嗨,謝謝,雖然我不能保證包的命名空間與命名空間相同。 –