projman/hlp/ru/tcl/pkg_mkIndex.html
2018-02-05 17:23:37 +03:00

150 lines
11 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>СИНТАКСИС</h2>
<pre>
<strong>pkg_mkIndex</strong> <em>dir</em> <em>pattern</em> ?<em>pattern</em> <em>pattern</em>...?
</pre>
<h2>ОПИСАНИЕ</h2>
<p>Процедура <strong>pkg_mkIndex</strong> представляет собой утилиту для
работы с Tcl-библиотеками. Она обеспечивает создание индексных
файлов, необходимых для автоматической загрузки пакетов, когда в
приложении встречается команда <strong><a href=
package.html#require>package require</a></strong>. Для создания
автоматически загружаемых пакетов необходимо выполнить следующие
действия:</p>
<ul>
<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>.
</li>
<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>
<li>Установить пакет как подкаталог одного из каталогов,
перечисленных в переменной <strong>tcl_pkgPath</strong>. Если в списке
<strong></strong> больше одного каталога, то бинарные файлы
с разделяемыми библиотеками обычно устанавливаются в первом
каталоге, а библиотеки Tcl-скриптов - во втором. В этих
каталогах должны также находиться файлы <strong>pkgIndex.tcl</strong>.
Пока пакеты будут размещаться в подкаталогах каталогов,
перечисленных в переменной <strong>tcl_pkgPath</strong>, этого будет
достаточно для их автоматической загрузки при выполнении
команды <a href=package.html#require><strong>package</strong>
<strong>require</strong></a>.</li>
<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>
<li><p>Если перечисленные выше шаги выполнены, то для
использования необходимого пакета достаточно выполнить в
приложении команду <strong><a href=package.html#require>
package require</a></strong>. Если, например, версии 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>
</li>
</ul>
<h2>ЗАГРУЗЧИК ПАКЕТОВ И АВТОЗАГРУЗЧИК</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>,
и <strong>auto_mkindex</strong>, поскольку в этом случае трудно
контролировать, какой из механизмов загрузки пакета сработает
первым, и, соответственно, какая версия пакета будет загружена.
</p>
<h2>КАК ЖЕ ЭТО РАБОТАЕТ?</h2>
<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>
</body>
</html>