188 lines
11 KiB
HTML
188 lines
11 KiB
HTML
<!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>
|
||
|
||
|
||
|