Проблема в том, что Tcl не находит индексный файл (который должен называться pkgIndex.tcl
) для вашего пакета. Если бы вы внедрили пакет weather 1.0
в виде файла weather.tcl
, то вы, вероятно, хотели бы иметь индексный файл, похожий на этот в том же каталоге :
package ifneeded weather 1.0 [list source [file join $dir weather.tcl]]
Это говорит «чтобы загрузить версию 1.0
пакета weather
, запустите этот скрипт», где скрипт генерируется во время выполнения и связывает $dir
in (это переменная, всегда определяемая в контексте, в котором запускается загрузчик индекса пакета package ifneeded
).
После этого вам нужно разрешить Tcl найти файл индекса. Это можно сделать, поместив этот каталог или его непосредственный родительский элемент в глобальный список Tcl auto_path
; либо сделайте это внутри своего скрипта перед загрузкой каких-либо пакетов (очень полезно для приложений, имеющих внутренние пакеты), либо вы можете инициализировать это и вне Tcl, установив переменную окружения TCLLIBPATH
. Обратите внимание, что значением этой переменной является список Tcl каталогов, а не системный путь, такой как env(PATH)
. Это имеет значение, если у вас есть обратные слэши или пробелы в именах каталогов, или если вы хотите иметь несколько элементов в списке. К счастью, вы можете избежать всех этих проблем в случае добавления одного каталога в качестве переменной среды, даже в Windows, используя /
вместо \
и следуя обычной практике установки и не оставляя пробела в именах. При добавлении пути во время запуска приложения это проще: вы просто используете lappend
, возможно, вот так (очень рано в вашем основном скрипте):
lappend auto_path [file join [file dirname [info script]] my_app_pacakges]
# If the script is in foo/bar.tcl then packages are in or below foo/my_app_packages