ASDF или другая модульная система, независимая от конфигурации дома и сайта - PullRequest
3 голосов
/ 05 января 2009

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

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

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

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

EDIT:

Ramarren:

Я проверю Грязные шарики. Спасибо.

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

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

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

Луис:

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

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

vatine:

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

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

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

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

Ответы [ 5 ]

1 голос
/ 05 января 2009
1 голос
/ 06 января 2009

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

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

1 голос
/ 05 января 2009

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

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

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

EDIT:

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

0 голосов
/ 07 сентября 2011

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

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

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

(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*.

0 голосов
/ 09 января 2009

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

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

...