tm
-
НАЗВАНИЕ
- tm — Средства для поиска и загрузки модулей Tcl
- СИНОПСИС
- ОПИСАНИЕ
-
::tcl::tm::path add ?path...?
- ::tcl::tm::path remove ?path...?
- ::tcl::tm::path list
- ::tcl::tm::roots ?path...?
- ::tcl::tm::path remove ?path...?
- ОПРЕДЕЛЕНИЕ МОДУЛЯ
- ПОИСК МОДУЛЕЙ
- ПУТИ ПО УМОЛЧАНИЮ
- ПУТИ, СПЕЦИФИЧНЫЕ ДЛЯ СИСТЕМЫ
-
file normalize [info library]/../tclX/X.y
- file normalize EXEC/tclX/X.y
- ПУТИ, СПЕЦИФИЧНЫЕ ДЛЯ САЙТА
- file normalize [info library]/../tclX/site-tcl
- ПУТИ, СПЕЦИФИЧНЫЕ ДЛЯ ПОЛЬЗОВАТЕЛЯ
-
$::env(TCLX_y_TM_PATH)
- $::env(TCLX.y_TM_PATH)
- СМОТРИТЕ ТАКЖЕ
- КЛЮЧЕВЫЕ СЛОВА
Имя
tm — Средства для поиска и загрузки модулей TclСинопсис
::tcl::tm::path add ?path...?::tcl::tm::path remove ?path...?
::tcl::tm::path list
::tcl::tm::roots ?path...?
Описание
Данный документ описывает средства для поиска и загрузки модулей Tcl (см. ОПРЕДЕЛЕНИЕ МОДУЛЯ для определения модуля Tcl). Поддерживаются следующие команды:- ::tcl::tm::path add ?path...?
- Пути добавляются в начало списка путей модулей в порядке их появления. Это означает, что последний аргумент становится новым началом списка.
Команда накладывает ограничение, что ни один путь не может быть родительским каталогом другого пути в списке. Если какой-либо из новых путей нарушает это ограничение, будет выведено сообщение об ошибке, прежде чем какой-либо из путей будет добавлен. Другими словами, если только один аргумент пути нарушает ограничение, то ни один из них не будет добавлен.
Если путь уже присутствует, ошибка не будет выведена, и никаких действий не будет предпринято.
Пути ищутся позже в порядке их появления в списке. По мере добавления их в начало списка они ищутся в обратном порядке добавления. Другими словами, пути, добавленные последними, рассматриваются в первую очередь.
- ::tcl::tm::path remove ?path...?
- Удаляет пути из списка путей модулей. Команда игнорирует все пути, которые отсутствуют в списке.
- ::tcl::tm::path list
- Возвращает список, содержащий все зарегистрированные пути модулей в порядке их поиска модулей.
- ::tcl::tm::roots ?path...?
- Аналогично команде path add и основана на ней. Эта команда принимает список путей, расширяет каждый из них с помощью “tclX/site-tcl” и “tclX/X.y”, для основной версии интерпретатора Tcl X и второстепенной версии y, меньшей или равной второстепенной версии интерпретатора, и добавляет полученный набор путей в список путей для поиска.
Эта команда используется системой для настройки системно-специфичных путей по умолчанию.
Эта команда была добавлена, чтобы позволить системе сборки определять дополнительные корневые пути, выходящие за рамки описанных в данном документе.
Определение модуля
Модуль Tcl — это пакет Tcl, содержащийся в одном файле и не требующий других файлов. Этот файл должен быть sourceable. Другими словами, модуль Tcl всегда импортируется следующим образом:source module_file
Команда load напрямую не используется. Это ограничение не является фактическим ограничением, как некоторые могут полагать. С версии 8.4 команда Tcl source считывает только до первого символа ^Z. Это позволяет нам объединить произвольный Tcl-скрипт с произвольными двоичными данными в один файл, где скрипт обрабатывает присоединённые данные, как ему заблагорассудится, полностью импортирует и активирует пакет.
Имя файла модуля должно соответствовать регулярному выражению:
([_[:alpha:]][:_[:alnum:]]*)-([[:digit:]].*)\.tm
Первая группа скобок определяет имя пакета, вторая — его версию. Помимо соответствия шаблону, извлечённое номер версии не должно вызывать ошибку при использовании в команде:
package vcompare $version 0
Поиск модулей
Дерево каталогов для хранения модулей Tcl отделено от других частей файловой системы и независимо от auto_path.Модули Tcl ищутся во всех каталогах, перечисленных в результате выполнения команды ::tcl::tm::path list. Это называется Путь к модулям. Переменные auto_path и tcl_pkgPath не используются. Все каталоги в пути к модулям должны соответствовать одному ограничению:
-
Для любых двух каталогов ни один из них не является предком другого.
Это необходимо для избежания неоднозначности в именах пакетов. Например, если в пути находятся два каталога “foo/” и “foo/cool”, пакет с именем cool::ice можно найти как cool::ice или ice, что может затем замаскировать пакет с именем ice, без квалификатора.
Перед началом поиска имя запрашиваемого пакета преобразуется в частичный путь с помощью следующего алгоритма:
-
Все вхождения “::” в имени пакета заменяются соответствующим символом разделителя каталогов для текущей платформы. Например, в Unix это “/”.
Пример:
-
Запрашиваемый пакет — encoding::base64. Полученный частичный путь — “encoding/base64”.
После этого преобразования пакет ищется во всех путях к модулям, последовательно объединяя их с частичным путем для создания полного шаблона поиска. Обратите внимание, что алгоритм поиска отклоняет все файлы, где имя файла не соответствует регулярному выражению, указанному в разделе ОПРЕДЕЛЕНИЕ МОДУЛЯ. Для оставшихся файлов генерируются и добавляются в базу данных пакета скрипты предоставления, если необходимо.
Алгоритм возвращается к обработчику неизвестных случаев, когда ни один из найденных файлов модулей не удовлетворяет запросу. Если запрос был удовлетворён, откат игнорируется.
Обратите внимание, что пакеты в форме модулей не имеют контроля над индексным и скриптом предоставления, введёнными в базу данных пакета для них. Для файла модуля MF индексный скрипт всегда:
package ifneeded PNAME PVERSION [list source MF]
а скрипт предоставления, встроенный в вышеприведенное, равен:
source MF
Имя пакета PNAME и версия пакета PVERSION извлекаются из имени файла MF в соответствии с определением ниже:
MF = /module_path/PNAME′-PVERSION.tm
Где PNAME′ — частичный путь модуля, как определено в разделе ПОИСК МОДУЛЕЙ, и преобразованный в PNAME путём изменения всех разделителей каталогов на “::”, а module_path — путь (из списка путей для поиска), в котором был найден файл модуля.
Также обратите внимание, что мы здесь создаём связь между именами пакетов и путями. Tcl различает регистры при сравнении имён пакетов, но существуют файловые системы, которые этого не делают, например, NTFS. К счастью, эти файловые системы сохраняют регистр имени, несмотря на то, что не используют эту информацию при сравнении.
Учитывая вышесказанное, мы допускаем использование смешанного регистра в именах пакетов в модулях Tcl, но также требуем, чтобы не было коллизий при сравнении имён без учёта регистра. Другими словами, если пакет Foo развернут в виде модуля Tcl, пакеты foo, fOo и т. д. больше не допускаются.
Пути по умолчанию
Список путей по умолчанию в пути к модулям вычисляется интерпретатором tclsh следующим образом, где X — главная версия интерпретатора Tcl, а y — второстепенная версия, меньше или равная второстепенной версии интерпретатора Tcl.Все пути по умолчанию добавляются в путь к модулям, даже те, которых не существует. Несуществующие пути отфильтровываются во время фактического поиска. Это позволяет пользователю создавать один из искомых путей по мере необходимости, и все запущенные приложения автоматически подберут любые модули, размещённые в них.
Пути добавляются в порядке, в котором они указаны ниже, а для списков путей, определённых переменной среды, — в порядке их обнаружения в переменной.
Пути, специфичные для системы
- file normalize [info library]/../tclX/X.y
- Другими словами, интерпретатор будет искать каталог, указанный по его основной версии, и чьи второстепенные версии меньше или равны второстепенной версии интерпретатора.
Например, для Tcl 8.4 ищутся следующие пути:
[info library]/../tcl8/8.4 [info library]/../tcl8/8.3 [info library]/../tcl8/8.2 [info library]/../tcl8/8.1 [info library]/../tcl8/8.0
Это определение предполагает, что пакет, определённый для Tcl X.y, также может быть использован всеми интерпретаторами, у которых основное число X одинаково и второстепенное число больше y.
- file normalize EXEC/tclX/X.y
- Где EXEC — file normalize [info nameofexecutable]/../lib или file normalize [::tcl::pkgconfig get libdir,runtime]
Этот набор путей обрабатывается аналогично предыдущему, за исключением того, что он привязан к EXEC_PREFIX. При сборке с PREFIX = EXEC_PREFIX оба набора одинаковы.
Пути, специфичные для сайта
- file normalize [info library]/../tclX/site-tcl
- Обратите внимание, что это всегда один элемент, так как X всегда имеет определённое значение (текущая основная версия Tcl).
Пути, специфичные для пользователя
- $::env(TCLX_y_TM_PATH)
- Список путей, разделенных либо : (Unix), либо ; (Windows). Данная переменная окружения зависит от пользователя и сайта, поскольку может быть установлена не только в профиле пользователя, но и скриптами конфигурации системы.
- $::env(TCLX.y_TM_PATH)
- Имеет то же значение и содержимое, что и предыдущая переменная. Однако использование точки '.' для разделения номера основной и дополнительной версии делает это имя менее переносимым, и его использование не рекомендуется. Поддержка этой переменной сохранена только для обратной совместимости со спецификацией оригинала, т. е. TIP 189.
Эти пути видны и, следовательно, общие для всех оболочек Tcl в $::env(PATH) пользователя.
Обратите внимание, что X и y следуют общим правилам, изложенным выше. Другими словами, Tcl 8.4, например, будет рассматривать эти 10 переменных окружения:
$::env(TCL8.4_TM_PATH) $::env(TCL8_4_TM_PATH) $::env(TCL8.3_TM_PATH) $::env(TCL8_3_TM_PATH) $::env(TCL8.2_TM_PATH) $::env(TCL8_2_TM_PATH) $::env(TCL8.1_TM_PATH) $::env(TCL8_1_TM_PATH) $::env(TCL8.0_TM_PATH) $::env(TCL8_0_TM_PATH)
См. также
пакет, Tcl Improvement Proposal #189 “Tcl Modules” (онлайн по адресу http://tip.tcl.tk/189.html), Tcl Improvement Proposal #190 “Implementation Choices for Tcl Modules” (онлайн по адресу http://tip.tcl.tk/190.html)
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/tm.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/tm.htm