The section, "How to write the main.tcl for a starkit" in "Starkit - How To's", presents a coherent and correct model for organizing starkit-oriented Tcl coding. Jean-Claude highlights there construction which allows the same source to be run unwrapped, within a starkit, within a starpack, and so on. It's important to understand the benefit of this. While I don't have a satisfying way yet to express it, the idea is something like this: to make the best advantage of existing software and experience in Tcl development, projects need to look "physically" as they always have: a main.tcl which sources other local Tcl scripts. If the project can be maintained either as a conventional pure-Tcl bundle, or a Starkit VFS, then it'll enjoy the advantages of both modes."How to write ..." aims at package-structured projects. As desirable as "packagization" is, this page presents an alternative, "package-less", outline for code maintenance. This makes startup more clumsy, as starkit automatically sets up the right search path for the packages it encapsulates. Once past the verbose work-around of the switch seen below, though, the source file hierarchy is easier to recognize as invariant across the different execution modes. This is a particular advantage for other sources, such as *.gif-s or so on. It also has the trivial advantage that it doesn't expose the "magic suffix" myapp.vfs in the code to be maintained. Moreover, it is, I believe, the most direct answer to the questions raised in one particular thread [1] (which itself invites more commentary--perhaps later) in comp.lang.tcl.This is the construction: write these four source files:
########
# This is make_example.sh
########
DEMONSTRATION=/tmp/demo$$
SRCDIR=example.vfs/lib/app-example
rm -rf example.vfs
sdx qwrap example.tcl
sdx unwrap example.kit
cp lib1.tcl $SRCDIR
mkdir $SRCDIR/subdir
cp subdir/lib2.tcl $SRCDIR/subdir
sdx wrap example.kit
# By removing all traces of the VFS image, and relocating
# to a fresh (empty) directory, we demonstrate that the
# sourc-ing is indeed working with the scripts packaged
# within example.kit. The larger significance is that deploy-
# ment demands no "installation"; example.kit encapsulates
# all the application-specific stuff necessary, in a single
# file, while allowing development to be structured in an
# arbitrary tree.
rm -rf example.vfs
mkdir $DEMONSTRATION
cp example.kit $DEMONSTRATION
cd $DEMONSTRATION
tclkit example.kit. ########
# This is example.tcl.
########
puts "Here I am."
package require starkit
switch [starkit::startup] {
unwrapped {
set offset ""
}
sourced {
set offset [file join lib app-example]
}
}
set srcdir [file join $starkit::topdir $offset]
set lib1 [file join $srcdir lib1.tcl]
set lib2 [file join $srcdir subdir lib2.tcl]
source $lib1
source $lib2. ########
# This is lib1.tcl
########
puts "I made it! This is lib1.tcl.". ########
# This is subdir/lib2.tcl
########
puts "This is lib2.tcl."If you now runtclkit example.tclOR
sh make_example.shthe output is the same:
Here I am.
I made it! This is lib1.tcl.
This is lib2.tcl.[Why is this here rather than within the Starkit Wiki [2]? The benefit is to subordinate Starkit details to a focus on Tcl coding and the development process.][... much more to say ...][which-starkit-name problem][Fix up tclkit << HERE
source example.tcl
HERE]How to create my first StarpackAttractive diagrams make "Anatomy of a starkit" [3] particularly edifying.
