Используя asdf, я могу загрузить систему, предоставляющую только ранее сделанные FASL - PullRequest
4 голосов
/ 22 июля 2011

У меня есть машина разработки и рабочая машина, которые идентичны (копия образа VM).Я хочу доставить приложение на рабочую машину вместе с файлом asd, но не хочу поставлять исходный код.Я подумал о двух способах:

1. При загрузке в формате asdf, предоставляя только файлы FASL на производственном компьютере

Плюсы: Когда мне нужно что-то изменить, я просто скомпилирую файлв devel machine и замените fasl в рабочей машине.

Минусы: я не знаю, если и как это можно сделать.

2.Использовать save-lisp-and-die или предпочтительно Инструмент Захари Бина для сборки приложений (я использую SBCL) для автоматизации процесса.

Плюсы: более простая автоматизация, более лаконичная и одна (хотя и большая) доставка файлов.

Минусы: плюсы предыдущего решения.

Я знаю, что те минусы и плюсы, о которых я упоминаю, не так важны по сравнению друг с другом, но я хотел бы знать любые плюсы и минусы, которые я не вижу, которые могут изменить мои варианты, или любое другое решение, котороеЯ не имею хотя.Также независимо от того, что я выберу, я хотел бы знать, возможно ли решение 1 и как.

Ответы [ 4 ]

4 голосов
/ 22 июля 2011

В настоящее время я поддерживаю ASDF. Я не знаю, что ASDF позволяет это. Я не был предназначен для этого. Тем не менее, я никогда не пытался и не могу поклясться, что это не будет, или что простой взлом не позволит вам сделать это. Я приветствую такой взлом в ASDF и / или расширение.

В худшем случае, если ASDF иначе не позволит вам сделать это, «простым» взломом будет создание файлов, содержащих (eval-when (: compile-toplevel: load-toplevel: execute) (ошибка «Это не реальный исходный файл ")) и предоставьте им временную метку 1970-01-01 вместо ваших исходных файлов. Сценарий может сделать это для вас, а умный взлом вашего исходного реестра может позволить вам переключаться между реальным исходным кодом и поддельным исходным кодом.

Удачи.

4 голосов
/ 22 июля 2011

Как правило, эти системные инструменты должны позволять это. Все, что вам нужно, это описание системы и файлы FASL. Системный инструмент должен затем использовать файлы FASL для загрузки. Нужно только убедиться, что он не имеет жесткой зависимости от какого-либо исходного файла.

Таким образом, программное обеспечение поставлялось в мир Lisp десятилетиями (> 30 лет). В этом подходе нет ничего плохого. Если с конкретным инструментом (здесь ASDF, но есть и другие) есть проблема, следует обратиться к авторам.

Если у вас возникла практическая проблема, вы должны обсудить ее в списке рассылки ASDF или задать вопрос здесь. У вас есть практическая проблема с этим?

Это не поможет вам напрямую, но может подсказать, как обычно работает системный инструмент | ред.

Пример с LispWorks 6 и его собственным DEFSYSTEM

У нас есть три файла в каталоге FOO:

RJMBA:foo joswig$ ls -l
-rw-r--r--  1 joswig  admin    13 22 Jul 20:42 a.lisp
-rw-r--r--  1 joswig  admin    14 22 Jul 20:42 b.lisp
-rw-r--r--  1 joswig  admin   331 22 Jul 20:41 system.lisp

system.lisp содержит следующее описание системы:

(defvar *foo-directory*
   (make-pathname :name nil
                  :type nil
                  :directory (pathname-directory *load-pathname*)
                  :defaults *load-pathname*))

(defsystem foo (:default-pathname *foo-directory*)
   :members ("a" "b"))

Выше задает *foo-directory* путь на основе пути к загруженному файлу. Таким образом, мы можем установить реальный абсолютный путь, но не нужно указывать его вручную. В качестве альтернативы мы могли бы использовать относительные имена путей - это зависит от того, что вы хотите использовать. Я выбрал это, чтобы показать, как автоматически установить абсолютный путь.

Теперь я загружаю этот файл в LispWorks, а затем компилирую систему:

CL-USER 12 > (compile-system 'foo)

;;; Compiling file /Lisp/foo/a.lisp ...
;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 1
;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3
;;; Source level debugging is on
;;; Source file recording is  on
;;; Cross referencing is on
; (TOP-LEVEL-FORM 0)
; (TOP-LEVEL-FORM 1)
;; Processing Cross Reference Information
;;; Compiling file /Lisp/foo/b.lisp ...
;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 1
;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3
;;; Source level debugging is on
;;; Source file recording is  on
;;; Cross referencing is on
; (TOP-LEVEL-FORM 0)
; (TOP-LEVEL-FORM 1)
;; Processing Cross Reference Information
(FOO)

Мы создали два файла fasl.

Теперь я копирую файл system.lisp и файлы fasl в новый каталог:

RJMBA:Lisp joswig$ mkdir bar
RJMBA:Lisp joswig$ cp foo/system.lisp bar/system.lisp
RJMBA:Lisp joswig$ cp foo/a.64xfasl bar/a.64xfasl
RJMBA:Lisp joswig$ cp foo/b.64xfasl bar/b.64xfasl

Теперь я начну новый LispWorks в каталоге b, загрузю файл system.lisp, а затем загрузлю систему:

RJMBA:Lisp joswig$ cd bar
RJMBA:bar joswig$ lispworks
LispWorks(R): The Common Lisp Programming Environment
Copyright (C) 1987-2009 LispWorks Ltd.  All rights reserved.
Version 6.0.0
User joswig on RJMBA.local
...
CL-USER 1 > (load "system.lisp")
; Loading text file /Lisp/bar/system.lisp
;; Creating system "FOO"
#P"/Lisp/bar/system.lisp"

CL-USER 2 > (load-system 'foo)

; Loading fasl file /Lisp/bar/a.64xfasl

"a" ; whatever the file does

; Loading fasl file /Lisp/bar/b.64xfasl

"b" ; whatever the file does

(FOO)

Готово и работает.

Кроме того, это можно сделать с помощью относительных каталогов или так называемых логических путей. Логические пути имеют отображение от некоторого пути к физическому пути, что позволяет использовать независимые от системы пути - независимо от архитектуры, ОС и структур каталогов. Это дает дополнительный уровень независимости от конкретного сценария развертывания.

1 голос
/ 20 февраля 2013

По состоянию на февраль 2013 года ASDF 3 теперь предлагает способ делать именно то, что вы хотите, используя FASL-OP и PRECOMPILED-SYSTEM.

1 голос
/ 26 июля 2011

Фаре прав - логика в ASDF делает load-op зависимым от compile-op, и он проверит, нужно ли compile-op, пытаясь сравнить дату записи файла на fasl с датой записи файла в файле .lisp.

Я полагаю, вы сможете выполнить эту работу, определив подкласс cl-source-file, скажем fasl-only, а затем переопределите метод operation-done-p для fasl-only и compile-op, чтобы он всегда возвращал t.

Вероятно, будет наиболее удобно настроить вашу систему защиты так, чтобы :default-component-class был fasl-only, и тогда ваша система защиты могла бы просто перечислить :file компоненты.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * nil -103 * * * * * * * * * * * * * * * * * * *1025* * * * * * * * *1025* может быть разумно также переопределить метод input-files на compile-op и fasl-only, чтобы возвратить *1025*, но я не уверен, что это необходимо.

...