2012-02-20 22 views
2

私はtcl/tkの初心者です。名前空間アンサンブルを使用してパッケージを作成しようとしています。Tcl - 名前空間とパッケージを複数のファイルに分割する

私の考えは、プロジェクトの管理をシンプルに保つために、ファイルのセットを作成することで、<name_package>-<name_procedure>.tcl

のようなものは、あなたがパッケージ内に複数のファイルに名前空間のアンサンブルを分割する方法を私に説明してもいいですか?

私は

package provide <name> 0.1 

namespace eval <namespace> { 

namespace export proc1 proc2 proc3 ... 
namespace ensemble create 

} 

とそれが動作しない手順

package provide <name> 0.1 

proc ::<namespace>::proc { ... } { 

... 

} 

を含むファイルを含む一つのファイルを作成やろうとしています。

私はどんな提案もありがとうございます。

感謝

答えて

5

は、私はあなたのパッケージのすべての構成ファイルをソースするpkgIndexファイルを使用します。それはすべてをロードします。次に、インタプリタにすべてがロードされたらアンサンブルを宣言します。

package ifneeded Mypackage 1.2.3 \ 
    "source \[file join [list $dir] pkg-part1.tcl\] ; \ 
    source \[file join [list $dir] pkg-part2.tcl\] ; \ 
    namespace ensemble create {...} ; \ 
    package provide Mypackage 1.2.3" 

各サブコンポーネントに「提供」しないでください。すべてが正常にインタプリタにロードされたらパッケージを提供するほうが良いので、ファイルの終わりに、またはこの場合にはフルセットをロードするようにしてください。それぞれの部分をサブパッケージとして扱いたいのであれば、それらをサブパッケージとして宣言しない理由はなく、それぞれのサブパッケージを必要とするマスターパッケージがあります。例えば:

<main package> 
    package require Package::part1 
    package require Package::part2 
    package provide Package 1.0 

<subpackage files> 
    namespace eval Package { 
    ... stuff ... 
    } 
    ... more stuff ... 
    package provide Package::partN 1.0 

<pkgIndex.tcl> 
    package ifneeded Package::part1 1.0 [list source [file join $dir part1.tcl]] 
    package ifneeded Package::part2 1.0 [list source [file join $dir part2.tcl]] 
    package ifneeded Package 1.0 [list source [file join $dir package.tcl]] 

このモデルは、サブコンポーネントが自分の役に立つかもしれません場合に有用であるか、またはそれが便利かもしれない場合にのみinterpのに特定の部分をロードすることができます。 tcllib SASLパッケージは、デフォルトでいくつかのメカニズムがロードされることを避けるためにこれを行います(NTLMなど)。

+0

それを修正感謝します。あなたは完璧に解決しています!最後のもの。私はまだ名前空間アンサンブルを作成しようとしています。 ' package ifneededを置いています。Package :: part1 1.0 [list source [file join $ dir part1.tcl]]パッケージifneeded Package :: part2 1.0 [list source [file join $ dir part2.tcl]]パッケージifneededパッケージ1.0 [リストソース[ファイル参加$ dir package.tcl]; \名前空間eval {名前空間ensamble作成}; \パッケージ提供 0.1] 'しかし、それは動作しません(私はアンサンブルが動作しないことを意味します) 。サブコマンドとして最初のパッケージからのprocのみを認識します。 –

0

解決しました。 patthoytsの2番目のソリューションは完璧です。

私は少し

<subpackage files> 
    namespace eval Package { 
    namespace export <proc_name> 
    } 
    ... more stuff ... 
    package provide Package::partN 1.0 

<pkgIndex.tcl> 
    package ifneeded Package::part1 1.0 [list source [file join $dir part1.tcl]] 
    package ifneeded Package::part2 1.0 [list source [file join $dir part2.tcl]] 
    package ifneeded Package 1.0 "[list source [file join $dir package.tcl]];\ 
           namespace eval <package> {namespace ensemble create};\ 
           package provide <package> 0.1" 

に追加する多くの多くの感謝

+0

あなたの例を修正してください: 'ensamble'を' ensemble'に置き換えてください。また、パットの答えに合格とマークするようにしてください。 – kostix

関連する問題