ASDF или другая модульная система, не зависящая от конфигурации дома и объекта

Я пытаюсь найти лучшие практики для разработки реальных приложений. Мне сложно понять, как правильно настроить сторонние библиотеки для развертывания в виде отдельного пакета. Кажется, что ASDF-INSTALL и ASDF предназначены для установки библиотек либо дома, либо на сайте, изменяя состояние платформы разработки. Это нормально, если я разрабатывал серверное приложение и хотел администрировать эти зависимости для всей установки CL на коробке.

Но что, если я хочу создать автономное приложение, развертываемое с помощью сценариев установки и работающее отдельно в собственном экземпляре CL? Я бы хотел избежать изменения экземпляра CL или конфигурации целевой системы для любых других приложений (т.е. перезаписывать другие копии библиотек, от которых зависят другие приложения). В Java все, что мне нужно сделать, это создать каталог include, содержащий эти библиотеки, и установить мой CLASSPATH. Как мне получить такой же уровень изоляции в CL, если я не устанавливаю собственную среду выполнения CL, а вместо этого использую то, что есть в системе?

Мне приходит в голову, что это общая проблема со всеми динамически компилируемыми / интерпретируемыми языками, поскольку время выполнения будет иметь время жизни дольше, чем любое конкретное приложение, которое запускает среда выполнения (например, Ruby или Python), и приложения будут использовать одно и то же состояние загрузки библиотеки. . У меня нет опыта общения с такими языками, поэтому лучше всего смотреть мне в глаза.

IDK, если это будет зависеть от конкретной реализации, но я использую Clozure CL.

РЕДАКТИРОВАТЬ:

Рамаррен:

Я проверю Mudballs. Спасибо.

Установка библиотек - это противоположность тому, что я хочу, поскольку установка подразумевает изменение состояния хост-системы. Я думаю, что ключ должен быть в вашем последнем абзаце. Как создать сценарий запуска для установки central-registry в изолированный каталог? Можно ли использовать ASDF-INSTALL для загрузки данных в указанный каталог? И как вы загрузите все это, если базовый образ вашей реализации CL не включает ASDF (Clozure имеет ASDF по умолчанию, но как CLISP сделает это)?

Я тоже думаю о команде разработчиков. После того, как я создам новую заглушку проекта CL и сделаю эту первоначальную фиксацию в CVS или SVN, как другие разработчики проверяют ее в своей локальной среде и работают с ней? Даже если предположить, что у всех есть ASDF при запуске профиля / сайта, другие разработчики могут иметь другой набор библиотек в их центральном реестре. Нам не нужно синхронизироваться, чтобы вместе работать над проектом. Должен быть чистый способ запустить конкретный для проекта экземпляр среды выполнения CL из Emacs / SLIME и загрузить именно то, что указано в проекте, ни больше, ни меньше.

Если есть какие-либо ресурсы по передовой практике в Интернете, на CL или на любом другом языке, я буду рад развернуть свое собственное решение и открыть его исходный код.

Луис:

SAVE-APPLICATION подходит для развертывания, но не для заглушки проекта с несколькими разработчиками, о которой я говорил.

РЕДАКТИРОВАТЬ 2:

ватин:

Зависимость от версии - вот почему это проблема. Если бы я разрабатывал веб-приложение на Perl или Ruby, то я мог бы полагаться на существование веб-администратора для управления этими зависимостями. При разработке приложений для розничной торговли или для малых и средних предприятий, где Lisp является чужеродной технологией (и я не могу убедить их «повысить квалификацию» своей ИТ-организации для ее администрирования), такой подход неприемлем.

Вчера вечером мне удалось получить то, что я хочу, создав файл .lisp на уровне проекта, который загружает собственный экземпляр ASDF для конкретного проекта, установил локальный центральный-реестр и загрузил вручную зависимые библиотеки (без ASDF-INSTALL, который был болезненным каскадом зависимостей только для CLSQL и Weblocks). Он по-прежнему не идеален с точки зрения инструментов разработчика, поскольку мне пришлось удалить все настройки из моего дома и сайта как для SLIME, так и для самого Clozure. Кроме того, общие зависимости также не разрешаются (CLSQL и Weblocks используют MD5).

В Java есть изоляция загрузчика классов, что решает проблему зависимости версий. Затем есть отдельный вопрос о том, как включить нужные библиотеки в проект (а-ля Maven). Первое - это основная языковая проблема; последнее связано с инструментами. Я собираюсь собрать расширение SLIME, которое делает то же, что ASDF-INSTALL делает с каталогом include проекта (а-ля Maven), и изменяет исходный код библиотеки, чтобы перехватывать вызовы defpackage, чтобы каким-то образом добавить строку gensym для обеспечения изоляции. Я знаю, что в этом подходе много дыр, и я не знаю достаточно о спецификации пакета, чтобы понять, насколько глубоко я могу это похоронить.

Я ничего не знаю о Python, но знаю, что существуют приложения розничного уровня; Я все время использую MusicBrainz Picard. Я посмотрю, как это делает Python.


person jennykwan    schedule 05.01.2009    source источник


Ответы (5)


Вам нужно CCL: SAVE-APPLICATION.

person Luís Oliveira    schedule 05.01.2009

Во-первых, ASDF не имеет ничего общего с установкой библиотек. Это просто инструмент для компиляции и загрузки набора файлов в порядке, определяемом зависимостями между ними. ASDF-INSTALL устанавливает вещи и использует ASDF для определения зависимостей (я думаю), но есть другой механизм для установки, например clbuild, извлечение и создание символических ссылок вручную или недавняя разработка Mudballs, заменяющая ASDF как Что ж.

Специальная переменная asdf:*central-registry* содержит список каталогов, в которых выполняется поиск систем asdf. Обычно он содержит патч к каталогу с символическими ссылками на фактические файлы определения системы, но в этом нет необходимости, так как он может просто содержать каждый каталог с файлом определения системы.

Эта переменная будет большую часть времени заполняться сценариями запуска с реестром библиотеки системы / сайта, но вы можете изменить ее на все, что захотите, включая изолированный локальный каталог. Что касается предпоследнего абзаца, обратите внимание, что запуск нескольких приложений в одной среде выполнения CL не является особенно распространенным. Обычно запускается какое-то голое ядро ​​по умолчанию, затем загружаются и запускаются библиотеки и приложение, а затем завершается работа по завершении.

РЕДАКТИРОВАТЬ:

ASDF - это просто библиотека, и ее переменные похожи на любую другую переменную lisp. В случае, который вы описываете, вы, вероятно, захотите подавить сценарий запуска системы / пользователя, который зависит от реализации (в CCL это явно аргумент командной строки -n или --no-init), а затем вручную загрузить asdf.lisp, (setf asdf:*central-registry* (list #p"pathtoprojectcentralregistry")). Или, возможно, создайте функцию для рекурсивного сканирования каталога проекта и проталкивания туда всех подкаталогов с файлами .asd.

person Ramarren    schedule 05.01.2009

В общем, я бы сказал, что все, что установлено как сторонняя библиотека, ДОЛЖНО изменять состояние хост-системы (как бы). Вещи, разработанные локально, можно обрабатывать несколькими способами, я использую для себя ферму символических ссылок (с сопутствующим сценарием оболочки для восстановления фермы, когда мне нужно). Проекты Lisp извлекаются в свои собственные каталоги. Таким же образом проверяются и взаимозависимые проекты, они ссылаются друг на друга в своих определениях системы ASDF и выбираются через ферму символических ссылок.

Единственная возможная проблема, которую я вижу в этой модели, - это если вы внезапно обнаружите, что часть ваших библиотек поддержки зависит от библиотеки BLAHONGA, извлеченной из CVS до 01.12.2008, а другие части ваших библиотек поддержки также зависят от BLAHONGA, но требуют наличия эта функция доступна только в CVS с 29 декабря 2008 г. Думаю, возможны и зависимости версий.

person Vatine    schedule 06.01.2009

Что касается вашей среды разработки, вы всегда можете где-нибудь проверить внешние библиотеки и попросить каждого разработчика проверить это в asdf:*central-registry*.

Другой вариант - иметь один блок разработчика, и каждый разработчик запускает там Lisp + Swank.

person jrockway    schedule 09.01.2009

У меня раньше была такая проблема. Обычно я решаю это следующим образом:

  1. Получите структуру всей системы, включая необходимые библиотеки, в систему контроля версий. (в этом могут помочь такие методы, как svn externals и эквивалент git)
  2. Настройте asdf:*central-registry* соответствующим образом в вашем cl init файле, чтобы он указывал на каталоги в вашей рабочей копии, которые содержат .asd файлы.

На самом деле, поскольку я работаю над несколькими проектами одновременно, я обычно заполняю свой файл cl init несколькими конфигурациями, как указано выше. Например.,

(defun project1 ()
  (push "/home/rpg/project1/src/" asdf:*central-registry*)
  (push "/home/rpg/project1/extlib/" asdf:*central-registry*))

Затем, когда я запускаю свою среду разработки, я могу просто ввести (project1), и ASDF будет настроен для моей работы в контексте проекта 1.

Вариант - сделать файл загрузки для каждого проекта и зарегистрировать его в корне исходной библиотеки. Этот файл загрузки настроит центральный реестр ASDF и загрузит систему. Конфигурация центрального реестра может быть независимой от размещения рабочей копии за счет использования *load-truename*.

Другой вариант - автоматический поиск в дереве рабочих каталогов, чтобы найти все каталоги, содержащие .asd файлы, и соответственно заполнить ваш asdf:*central-registry*.

person Robert P. Goldman    schedule 07.09.2011