common-lisp Buildapp Bonjour Web World


Exemple

Un exemple plus réaliste concerne un projet que vous --eval avec plusieurs fichiers sur disque (plutôt qu'une option --eval transmise à buildapp ), et certaines dépendances à buildapp .

Étant donné que des choses arbitraires peuvent se produire pendant la recherche et le chargement de systèmes asdf (y compris le chargement d'autres systèmes potentiellement non liés), il ne suffit pas d'inspecter les fichiers asd des projets dont vous asdf pour déterminer ce que vous devez charger. . L'approche générale consiste à utiliser quicklisp pour charger le système cible, puis à appeler ql:write-asdf-manifest-file pour écrire un manifeste complet de tout ce qui est chargé.

Voici un système de jouet construit avec hunchentoot pour illustrer comment cela pourrait se produire dans la pratique:


;;;; buildapp-hello-web-world.asd

(asdf:defsystem #:buildapp-hello-web-world
  :description "An example application to use when getting familiar with buildapp"
  :author "inaimathi <leo.zovic@gmail.com>"
  :license "Expat"
  :depends-on (#:hunchentoot)
  :serial t
  :components ((:file "package")
               (:file "buildapp-hello-web-world"))
;;;; package.lisp

(defpackage #:buildapp-hello-web-world
  (:use #:cl #:hunchentoot))
;;;; buildapp-hello-web-world.lisp

(in-package #:buildapp-hello-web-world)

(define-easy-handler (hello :uri "/") ()
  (setf (hunchentoot:content-type*) "text/plain")
  "Hello Web World!")

(defun main (argv)
  (declare (ignore argv))
  (start (make-instance 'easy-acceptor :port 4242))
  (format t "Press any key to exit...~%")
  (read-char))
;;;; build.lisp
(ql:quickload :buildapp-hello-web-world)
(ql:write-asdf-manifest-file "/tmp/build-hello-web-world.manifest")
(with-open-file (s "/tmp/build-hello-web-world.manifest" :direction :output :if-exists :append)
  (format s "~a~%" (merge-pathnames
            "buildapp-hello-web-world.asd"
            (asdf/system:system-source-directory
             :buildapp-hello-web-world))))
#### build.sh
sbcl --load "build.lisp" --quit

buildapp --manifest-file /tmp/build-hello-web-world.manifest --load-system hunchentoot --load-system buildapp-hello-web-world --output hello-web-world --entry buildapp-hello-web-world:main

Une fois que vous avez ces fichiers enregistrés dans un répertoire nommé buildapp-hello-web-world , vous pouvez le faire

$ cd buildapp-hello-web-world/

$ sh build.sh 
This is SBCL 1.3.7.nixos, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
To load "cffi":
  Load 1 ASDF system:
    cffi
; Loading "cffi"
........
To load "buildapp-hello-web-world":
  Load 1 ASDF system:
    buildapp-hello-web-world
; Loading "buildapp-hello-web-world"
....
;; loading system "cffi"
;; loading system "hunchentoot"
;; loading system "buildapp-hello-web-world"
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into hello-web-world:
writing 4800 bytes from the read-only space at 0x20000000
writing 4624 bytes from the static space at 0x20100000
writing 66027520 bytes from the dynamic space at 0x1000000000
done]

$ ls -lh hello-web-world 
-rwxr-xr-x 1 inaimathi inaimathi 64M Aug 13 21:17 hello-web-world

Cela produit un binaire qui correspond exactement à ce que vous pensez, compte tenu de ce qui précède.

$ ./hello-web-world 
Press any key to exit...

Vous devriez alors pouvoir lancer un autre shell, faire curl localhost:4242 et voir la réponse en texte clair de Hello Web World! faire imprimer