なんとなくめんどくさそうな感じで使うのを避けてきたStarkitだけど、使ってみたいパッケージがstarkit形式で配布されてた && [source hoge.kit]でstarkit形式のパッケージが読みこめるというのを知って、ちょっと興味がでてきたので使い方をまとめてみる。。。
starkitはスクリプトやらバイナリやらを一つのファイルにまとめる仮想ファイルシステムで、starkit拡張の実体はlib/vfs1.x/starkit.tclのようだ。ActiveTclではデフォでインストールされている。
あと名前がややこしい。
SDXはsdx.kitで配布されているので、実行するにはtclの実行環境が必要。tclshよりtclkitを使ったほうがバグが無いかも。
tclsh sdx.kit qwrap hoge.tcl
とか
tclkit sdx.kit qwrap hoge.tcl
コマンド
sdx qwrap myscript.tcl ?name? ?-runtime runtime.kit? name name.kitに名前を変更 -runtime file 実行環境付き
sdx wrap mystar.kit ?options...? -interp name tclkit以外の実行環境にしたいとき(バッチファイルの出力が変るだけ) -nocomp ファイルを圧縮しない -runtime file 実行環境付き -verbose ラッピング中の挙動を一々報告する -writable 変更を可能にする(?)
sdx unwrap mystar.kit
sdx lsk mystar.kit sdx ls ?-l? mystar.kit lsでディレクトリなどを掘り下げる時はsdx ls -l mystar.kit/libのようにする。
sdx version mystar.kit~
sdx mkpack oldstar.kit newstar.kit
sdx mksplit mystar.kitheadファイルにはstarkitのヘッダやexe(starpackの場合?)が含まれていて、tailファイルにはMetakitのデータが含まれている。Tclkitにエンコードを追加したいときは、このコマンドで分割し、tailファイルを作り直すようだ。
copy /b mystar.head + mystar.tail mystar.exe
sdx update mystar.kit ?options...? -from url urlのStarsyncサーバ(http)に接続する。 -n 差分を表示するだけでアップデートは実行しない。http://mini.net/sdarchive/ に色々なstarkitがある。
sdx ftpd ?option?
sdx httpd ?option?
hello.tcl
package require Tk tk_messageBox -message "Hello World"
ラップする
tclsh sdx.kit qwrap hello.tcl -runtime tclkit.exe rename hello hello.exe
複数ファイルの場合、hoge.vfsという仮想ファイルシステムのrootになるディレクトリを作りそこにファイルをまとめて置く。また、スタートアップのスクリプトはmain.tclにしておく。あとファイルパス名に注意すること。
hello.vfs/main.tcl
package require Tk set vroot [file dirname $argv0] set datfile [file join $vroot data.dat] set fs [open $datfile r] set str [read $fs] close $fs tk_messageBox -message $str
hello.vfs/data.dat
This is a test file.
ラップする
tclsh sdx.kit wrap hello.exe -runtime tclkit.exe
日本語のエンコーディングはデフォで入っていないので追加しないと日本語が文字化けする。ここではWindowsの例を示す。 まずtclkitを用意する。ここではtclkit-win32.upx.exeを使うことにする。
tclsh sdx.kit unwrap tclkit-win32.upx.exe
としてtclkitを解凍する。できたtclkit-win32.upx.vfsディレクトリ中のlib/tcl8.4/encoding/に必要なエンコーディング(例えばcp932,shiftjis,euc-jpなど)をオリジナルのとこから持ってきてコピーする。
sdx mksplit tclkit-win32.upx.exe
としてバイナリを分離する。tclkit-win32.upx.tailと、tclkit-win32.upx.headができる。
sdx wrap tclkit-win32.upx.exe -runtime tclkit-win32.upx.head として再ラップする。この場合tclkitを上書きしてるので、嫌なら先に適当に名前を変えておくこと。
(参考) http://www.equi4.com/tkunicode.html
http://www.interq.or.jp/japan/s-imai/tcltk/tclkit.html
http://wiki.tcl.tk/8186