<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN> <html> <head> <title>pkg_mkIndex</title> </head> <body> <h1>pkg_mkIndex</h1> <p>Создает индексный файл для автоматической загрузки пакета.</p> <h2><a name=СИНТАКСИС></a>СИНТАКСИС</h2> <pre> <strong>pkg_mkIndex</strong> <em>dir pattern</em> ?<em>pattern pattern...</em>? </pre> <h2><a name=ОПИСАНИЕ></a>ОПИСАНИЕ</h2> <p>Процедура <strong>pkg_mkIndex</strong> представляет собой утилиту для работы с Tcl-библиотеками. Она обеспечивает создание индексных файлов, необходимых для автоматической загрузки пакетов, когда в приложении встречается команда <a href= package.html#require><strong>package require</strong></a>. Для создания автоматически загружаемых пакетов необходимо выполнить следующие действия:</p> <table> <tr> <td>[1]</td> <td>Создать один или несколько пакетов. Каждый пакет может состоять из одного или больше файлов с Tcl-скриптами или из бинарных файлов. Бинарные файлы должны быть пригодны для их загрузки с помощью команды <a href= load.html><strong>load</strong></a> с единственным аргументом -именем файла. Например, если в пакет входит файл <strong>test.so</strong>, он должен загружаться командой <strong>load test.so</strong>. Каждый файл Tcl-скриптов должен содержать команду <a href= package.html#provide><strong>package provide</strong></a> с именем пакета и версией. Каждый бинарный файл должен содержать вызов процедуры <strong>Tcl_PkgProvide</strong>. </td> </tr> <tr> <td>[2]</td> <td>Создать индексные файлы с помощью команды <strong>pkg_mkIndex</strong>. Аргумент <em>dir</em> указывает имя каталога, в котором лежат файлы пакета, а шаблоны <em>pattern</em>, которые могут содержать специальные символы, как в команде <a href= glob.html><strong>glob</strong></a>, указывают на файлы в этом каталоге. Команда <strong>pkg_mkIndex</strong> создаст в каталоге <em>dir</em> файл <strong>pkgIndex.tcl</strong>, содержащий информацию обо всех файлах пакета, заданных с помощью аргументов <em>pattern</em>. Для этого загружаются все файлы пакета, и определяется, какие новые пакеты и какие новые процедуры появились (поэтому в каждом файле пакета и должна быть команда <a href= package.html#provide><strong>package provide</strong></a> или вызов <strong>Tcl_PkgProvide</strong>). </td> </tr> <tr> <td>[3]</td> <td>Установить пакет как подкаталог одного из каталогов, перечисленных в переменной <strong>tcl_pkgPath</strong>. Если в списке <strong></strong> больше одного каталога, то бинарные файлы с разделяемыми библиотеками обычно устанавливаются в первом каталоге, а библиотеки Tcl-скриптов . во втором. В этих каталогах должны также находиться файлы <strong>pkgIndex.tcl</strong>. Пока пакеты будут размещаться в подкаталогах каталогов, перечисленных в переменной <strong>tcl_pkgPath</strong>, этого будет достаточно для их автоматической загрузки при выполнении команды <a href= package.html#require><strong>package require</strong></a>. </td> <tr> <td>[4]</td> <td>Если вы установили пакеты в каких-либо других каталогах, то необходимо, чтобы эти каталоги содержались в переменной <strong>auto_path</strong> или были бы непосредственными подкаталогами одного из содержащихся там каталогов. Переменная <strong>auto_path</strong> содержит список каталогов, которые просматриваются как автозагрузчиком, так и загрузчиком пакетов. По умолчанию он включает <strong></strong>. Загрузчик пакетов также просматривает и подкаталоги каталогов, включенных в <strong>auto_path</strong>. Пользователь может в явном виде включить в приложении необходимые каталоги в <strong>auto_path.</strong> А можно включить эти каталоги в переменную окружения <strong>TCLLIBPATH</strong>. Если она существует, то используется для инициализации переменной <strong>auto_path</strong> при запуске приложения. </td> </tr> </table> <p>Если перечисленные выше шаги выполнены, то для использования необходимого пакета достаточно выполнить в приложении команду <a href=package.html#require><strong>package require</strong></a>. Если, например, версии 2.1, 2.3 и 3.1 пакета <strong>Test</strong> проиндексированы и хранятся в соответствующих каталогах, то команда</p> <pre> package require Test </pre> <p>загрузит версию 3.1. А команда</p> <pre> package require -exact Test 2.1 </pre> <p>загрузит версию 2.1. В различных каталогах могут храниться много версий одного и того же пакета, но в данный интерпретатор может быть загружена только одна из них . та, которая будет затребована первой. Однако, в различных интерпретаторах одного приложения могут быть загружены различные версии одного и того же пакета.</p> <h2><a name=ЗАГРУЗЧИК_ПАКЕТОВ_И_АВТОЗАГРУЗЧИК></a>ЗАГРУЗЧИК ПАКЕТОВ И АВТОЗАГРУЗЧИК</h2> <p>Автозагрузчик и загрузчик пакетов во многом имеют сходные возможности, поскольку и тот, и другой предназначены для загрузки файлов по требованию. Однако загрузчик файлов представляет собой механизм более высокого уровня, который использует автозагрузчик на последнем шаге процесса загрузки. Как правило, предпочтительнее индексировать пакеты с помощью команды <a href=pkg_mkIndex.html><strong>pkg_mkIndex</strong></a>, чем с помощью команды <strong>auto_mkindex</strong>, поскольку это обеспечивает подключение механизма версий. Вы можете иметь несколько версий одного и того же пакета и, более того, использовать в различных приложениях различные версии. Напротив, <strong>auto_mkindex</strong> позволяет работать с единственной версией пакета. Скорее всего, не стоит создавать индексы для пакета с помощью и <a href=pkg_mkIndex.html><strong>pkg_mkIndex</strong></a>, и <a href=><strong>auto_mkindex</strong></a>, поскольку в этом случае трудно контролировать, какой из механизмов загрузки пакета сработает первым, и, соответственно, какая версия пакета будет загружена.</p> <h2><a name=КАК_ЖЕ_ЭТО_РАБОТАЕТ></a>КАК ЖЕ ЭТО РАБОТАЕТ?</h2> <p>При первом вызове команды <a href= package.html#require><strong>package require</strong></a> исполняется скрипт <a href=package.html#unknown><strong>package unknown</strong></a>. При инициализации Tcl-скрипт <a href= package.html#unknown><strong>package unknown</strong></a> задается таким образом, что он выполняет все файлы <strong>pkgIndex.tcl</strong> в каталогах <a href=><strong>auto_path</strong></a>. Эти файлы содержат команды <a href=package.html#ifneeded><strong>package ifneeded</strong></a> для каждой доступной версии каждого доступного пакета. Эти команды в свою очередь вызывают команды <a href= package.html#provide><strong>package provide</strong></a>, которые объявляют данные версии доступными. Кроме того, они формируют необходимую исходную информацию для автозагрузчика. Данный файл данной версии данного пакета реально загружается только тогда, когда вызывается первая из содержащихся в нем команд. Таким образом, после выполнения команды <a href= package.html#require><strong>package require</strong></a> вы не увидите команд пакета в интерпретаторе, но, тем не менее, вы сможете их вызвать и при этом они загрузятся автоматически.</p> </body> </html>