Создает индексный файл для автоматической загрузки пакета.
pkg_mkIndex dir pattern ?pattern pattern...?
Процедура pkg_mkIndex представляет собой утилиту для работы с Tcl-библиотеками. Она обеспечивает создание индексных файлов, необходимых для автоматической загрузки пакетов, когда в приложении встречается команда package require. Для создания автоматически загружаемых пакетов необходимо выполнить следующие действия:
[1] | Создать один или несколько пакетов. Каждый пакет может состоять из одного или больше файлов с Tcl-скриптами или из бинарных файлов. Бинарные файлы должны быть пригодны для их загрузки с помощью команды load с единственным аргументом -именем файла. Например, если в пакет входит файл test.so, он должен загружаться командой load test.so. Каждый файл Tcl-скриптов должен содержать команду package provide с именем пакета и версией. Каждый бинарный файл должен содержать вызов процедуры Tcl_PkgProvide. |
[2] | Создать индексные файлы с помощью команды pkg_mkIndex. Аргумент dir указывает имя каталога, в котором лежат файлы пакета, а шаблоны pattern, которые могут содержать специальные символы, как в команде glob, указывают на файлы в этом каталоге. Команда pkg_mkIndex создаст в каталоге dir файл pkgIndex.tcl, содержащий информацию обо всех файлах пакета, заданных с помощью аргументов pattern. Для этого загружаются все файлы пакета, и определяется, какие новые пакеты и какие новые процедуры появились (поэтому в каждом файле пакета и должна быть команда package provide или вызов Tcl_PkgProvide). |
[3] | Установить пакет как подкаталог одного из каталогов, перечисленных в переменной tcl_pkgPath. Если в списке больше одного каталога, то бинарные файлы с разделяемыми библиотеками обычно устанавливаются в первом каталоге, а библиотеки Tcl-скриптов . во втором. В этих каталогах должны также находиться файлы pkgIndex.tcl. Пока пакеты будут размещаться в подкаталогах каталогов, перечисленных в переменной tcl_pkgPath, этого будет достаточно для их автоматической загрузки при выполнении команды package require. |
[4] | Если вы установили пакеты в каких-либо других каталогах, то необходимо, чтобы эти каталоги содержались в переменной auto_path или были бы непосредственными подкаталогами одного из содержащихся там каталогов. Переменная auto_path содержит список каталогов, которые просматриваются как автозагрузчиком, так и загрузчиком пакетов. По умолчанию он включает . Загрузчик пакетов также просматривает и подкаталоги каталогов, включенных в auto_path. Пользователь может в явном виде включить в приложении необходимые каталоги в auto_path. А можно включить эти каталоги в переменную окружения TCLLIBPATH. Если она существует, то используется для инициализации переменной auto_path при запуске приложения. |
Если перечисленные выше шаги выполнены, то для использования необходимого пакета достаточно выполнить в приложении команду package require. Если, например, версии 2.1, 2.3 и 3.1 пакета Test проиндексированы и хранятся в соответствующих каталогах, то команда
package require Test
загрузит версию 3.1. А команда
package require -exact Test 2.1
загрузит версию 2.1. В различных каталогах могут храниться много версий одного и того же пакета, но в данный интерпретатор может быть загружена только одна из них . та, которая будет затребована первой. Однако, в различных интерпретаторах одного приложения могут быть загружены различные версии одного и того же пакета.
Автозагрузчик и загрузчик пакетов во многом имеют сходные возможности, поскольку и тот, и другой предназначены для загрузки файлов по требованию. Однако загрузчик файлов представляет собой механизм более высокого уровня, который использует автозагрузчик на последнем шаге процесса загрузки. Как правило, предпочтительнее индексировать пакеты с помощью команды pkg_mkIndex, чем с помощью команды auto_mkindex, поскольку это обеспечивает подключение механизма версий. Вы можете иметь несколько версий одного и того же пакета и, более того, использовать в различных приложениях различные версии. Напротив, auto_mkindex позволяет работать с единственной версией пакета. Скорее всего, не стоит создавать индексы для пакета с помощью и pkg_mkIndex, и auto_mkindex, поскольку в этом случае трудно контролировать, какой из механизмов загрузки пакета сработает первым, и, соответственно, какая версия пакета будет загружена.
При первом вызове команды package require исполняется скрипт package unknown. При инициализации Tcl-скрипт package unknown задается таким образом, что он выполняет все файлы pkgIndex.tcl в каталогах auto_path. Эти файлы содержат команды package ifneeded для каждой доступной версии каждого доступного пакета. Эти команды в свою очередь вызывают команды package provide, которые объявляют данные версии доступными. Кроме того, они формируют необходимую исходную информацию для автозагрузчика. Данный файл данной версии данного пакета реально загружается только тогда, когда вызывается первая из содержащихся в нем команд. Таким образом, после выполнения команды package require вы не увидите команд пакета в интерпретаторе, но, тем не менее, вы сможете их вызвать и при этом они загрузятся автоматически.