Recherche…


BuildingApp

Les binaires Common Lisp autonomes peuvent être buildapp avec buildapp . Avant de pouvoir l'utiliser pour générer des fichiers binaires, nous devons l'installer et le construire.

La façon la plus simple de savoir comment utiliser quicklisp et Common Lisp (cet exemple utilise [ sbcl ], mais cela ne devrait pas faire la différence.)

$ sbcl

This is SBCL 1.3.5.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.

* (ql:quickload :buildapp)
To load "buildapp":
  Load 1 ASDF system:
    buildapp
; Loading "buildapp"

(:BUILDAPP)

* (buildapp:build-buildapp)
;; loading system "buildapp"
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into /home/inaimathi/buildapp:
writing 4800 bytes from the read-only space at 0x20000000
writing 3216 bytes from the static space at 0x20100000
writing 47349760 bytes from the dynamic space at 0x1000000000
done]
NIL

* (quit)

$ ls -lh buildapp 
-rwxr-xr-x 1 inaimathi inaimathi 46M Aug 13 20:12 buildapp
$

Une fois que ce binaire est construit, vous pouvez l'utiliser pour construire des binaires de vos programmes Common Lisp. Si vous avez l'intention de le faire beaucoup, vous devriez probablement le placer quelque part sur votre PATH afin de pouvoir l'exécuter avec buildapp depuis n'importe quel répertoire.

Buildapp Hello World

Le binaire le plus simple possible

  1. N'a pas de dépendances
  2. Ne prend pas d'arguments en ligne de commande
  3. Juste écrit "Bonjour tout le monde!" stdout

Après avoir construit buildapp , vous pouvez simplement ...

$ buildapp --eval '(defun main (argv) (declare (ignore argv)) (write-line "Hello, world!"))' --entry main --output hello-world
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into hello-world:
writing 4800 bytes from the read-only space at 0x20000000
writing 3216 bytes from the static space at 0x20100000
writing 43220992 bytes from the dynamic space at 0x1000000000
done]

$ ./hello-world 
Hello, world!

$

Buildapp Bonjour Web World

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 <[email protected]>"
  :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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow