Suche…


Gebäude bauenapp

Standalone-Common-Lisp-Binaries können mit buildapp . Bevor wir es zum Erzeugen von Binärdateien verwenden können, müssen wir es installieren und erstellen.

Am einfachsten weiß ich, wie man quicklisp und Common Lisp verwendet (dieses Beispiel verwendet [ sbcl ], aber es sollte keinen Unterschied machen, welchen Sie verwenden).

$ 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
$

Wenn Sie diese Binärdatei erstellt haben, können Sie Binärdateien Ihrer Common Lisp-Programme erstellen. Wenn Sie beabsichtigen , diese viel zu tun, sollten Sie es auch wahrscheinlich irgendwo auf Ihrem setzen PATH , so dass Sie nur mit ausführen können buildapp aus einem beliebigen Verzeichnis.

Buildapp Hallo Welt

Die einfachste mögliche Binärdatei, die Sie erstellen könnten

  1. Hat keine Abhängigkeiten
  2. Nimmt keine Befehlszeilenargumente an
  3. Schreibt einfach "Hallo Welt!" stdout

Nachdem Sie buildapp , können Sie einfach ...

$ 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 Hallo Webwelt

Ein realistischeres Beispiel betrifft ein Projekt, das Sie mit mehreren Dateien auf der Festplatte erstellen (und nicht die Option --eval die an buildapp ) sowie einige Abhängigkeiten, die Sie buildapp .

Da beim Finden und Laden von asdf Systemen beliebige Dinge passieren können (einschließlich des Ladens anderer, möglicherweise nicht zusammenhängender Systeme), reicht es nicht aus, nur die asd Dateien der Projekte zu überprüfen, von denen Sie abhängig sind, um herauszufinden, was Sie laden müssen . Der allgemeine Ansatz besteht quicklisp , das Zielsystem mit quicklisp zu laden und anschließend ql:write-asdf-manifest-file , um ein volles Manifest über alles zu schreiben, was geladen ist.

Hier ist ein Spielzeug mit hunchentoot zu zeigen, wie das in der Praxis passieren könnte:


;;;; 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

Wenn Sie diese Dateien in einem Verzeichnis namens buildapp-hello-web-world gespeichert haben, können Sie dies tun

$ 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

Dies erzeugt eine Binärdatei, die genau das tut, was Sie angesichts der obigen Angaben Ihrer Meinung nach tun sollten.

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

Sie sollten dann in der Lage sein, eine andere Shell zu curl localhost:4242 und die Klartextantwort von Hello Web World! ausdrucken lassen



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow