2018-02-05 17:22:04 +03:00
|
|
|
|
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>pkg_mkIndex</title>
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
<h1>pkg_mkIndex</h1>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Создает индексный файл для автоматической загрузки пакета.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>СИНТАКСИС</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<strong>pkg_mkIndex</strong> <em>dir</em> <em>pattern</em> ?<em>pattern</em> <em>pattern</em>...?
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ОПИСАНИЕ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Процедура <strong>pkg_mkIndex</strong> представляет собой утилиту для
|
|
|
|
|
работы с Tcl-библиотеками. Она обеспечивает создание индексных
|
|
|
|
|
файлов, необходимых для автоматической загрузки пакетов, когда в
|
|
|
|
|
приложении встречается команда <strong><a href=
|
|
|
|
|
package.html#require>package require</a></strong>. Для создания
|
|
|
|
|
автоматически загружаемых пакетов необходимо выполнить следующие
|
|
|
|
|
действия:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<ul>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<li>Создать один или несколько пакетов. Каждый пакет может
|
|
|
|
|
состоять из одного или больше файлов с 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</strong>
|
|
|
|
|
<strong>provide</strong></a> с именем пакета и версией. Каждый бинарный
|
|
|
|
|
файл должен содержать вызов процедуры <strong>Tcl_PkgProvide</strong>.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</li>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<li>Создать индексные файлы с помощью команды
|
|
|
|
|
<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</strong>
|
|
|
|
|
<strong>provide</strong></a> или вызов <strong>Tcl_PkgProvide)</strong>.</li>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<li>Установить пакет как подкаталог одного из каталогов,
|
|
|
|
|
перечисленных в переменной <strong>tcl_pkgPath</strong>. Если в списке
|
|
|
|
|
<strong></strong> больше одного каталога, то бинарные файлы
|
|
|
|
|
с разделяемыми библиотеками обычно устанавливаются в первом
|
|
|
|
|
каталоге, а библиотеки Tcl-скриптов - во втором. В этих
|
|
|
|
|
каталогах должны также находиться файлы <strong>pkgIndex.tcl</strong>.
|
|
|
|
|
Пока пакеты будут размещаться в подкаталогах каталогов,
|
|
|
|
|
перечисленных в переменной <strong>tcl_pkgPath</strong>, этого будет
|
|
|
|
|
достаточно для их автоматической загрузки при выполнении
|
|
|
|
|
команды <a href=package.html#require><strong>package</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<strong>require</strong></a>.</li>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<li>Если вы установили пакеты в каких-либо других каталогах, то
|
|
|
|
|
необходимо, чтобы эти каталоги содержались в переменной
|
|
|
|
|
<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> при
|
|
|
|
|
запуске приложения.</li>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<li><p>Если перечисленные выше шаги выполнены, то для
|
|
|
|
|
использования необходимого пакета достаточно выполнить в
|
|
|
|
|
приложении команду <strong><a href=package.html#require>
|
|
|
|
|
package require</a></strong>. Если, например, версии 2.1, 2.3 и
|
|
|
|
|
3.1 пакета <strong>Test</strong> проиндексированы и хранятся в
|
|
|
|
|
соответствующих каталогах, то команда</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
package require Test
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>загрузит версию 3.1. А команда</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
package require -exact Test 2.1
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>загрузит версию 2.1. В различных каталогах могут храниться
|
|
|
|
|
много версий одного и того же пакета, но в данный
|
|
|
|
|
интерпретатор может быть загружена только одна из них - та,
|
|
|
|
|
которая будет затребована первой. Однако, в различных
|
|
|
|
|
интерпретаторах одного приложения могут быть загружены
|
|
|
|
|
различные версии одного и того же пакета.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ЗАГРУЗЧИК ПАКЕТОВ И АВТОЗАГРУЗЧИК</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>,
|
|
|
|
|
и <strong>auto_mkindex</strong>, поскольку в этом случае трудно
|
|
|
|
|
контролировать, какой из механизмов загрузки пакета сработает
|
|
|
|
|
первым, и, соответственно, какая версия пакета будет загружена.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>КАК ЖЕ ЭТО РАБОТАЕТ?</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>При первом вызове команды <a
|
|
|
|
|
href=package.html#require><strong>package</strong> <strong>require</strong></a>
|
|
|
|
|
исполняется скрипт <a href=package.html#unknown><strong>package</strong>
|
|
|
|
|
<strong>unknown</strong></a>. При инициализации Tcl-скрипт <a
|
|
|
|
|
href=package.html#unknown><strong>package</strong> <strong>unknown</strong></a>
|
|
|
|
|
задается таким образом, что он выполняет все файлы
|
|
|
|
|
<strong>pkgIndex.tcl</strong> в каталогах <strong>auto_path.</strong> Эти файлы
|
|
|
|
|
содержат команды <a href= package.html#ifneeded><strong>package</strong>
|
|
|
|
|
<strong>ifneeded</strong></a> для каждой доступной версии каждого
|
|
|
|
|
доступного пакета. Эти команды в свою очередь вызывают команды
|
|
|
|
|
<strong><a href= package.html#provide>package provide</a></strong>,
|
|
|
|
|
которые объявляют данные версии доступными. Кроме того, они
|
|
|
|
|
формируют необходимую исходную информацию для
|
|
|
|
|
автозагрузчика. Данный файл данной версии данного пакета реально
|
|
|
|
|
загружается только тогда, когда вызывается первая из
|
|
|
|
|
содержащихся в нем команд. Таким образом, после выполнения
|
|
|
|
|
команды <a href= package.html#require><strong>package</strong>
|
|
|
|
|
<strong>require</strong></a> вы не увидите команд пакета в интерпретаторе,
|
|
|
|
|
но, тем не менее, вы сможете их вызвать и при этом они
|
|
|
|
|
загрузятся автоматически.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</body>
|
|
|
|
|
</html>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|