수색…


Buildapp 빌드하기

독립 실행 형 Common Lisp 바이너리는 buildapp 로 빌드 할 수 있습니다. 바이너리를 생성하기 전에이 파일을 설치하고 빌드해야합니다.

quicklisp 과 Common Lisp (이 예제는 [ sbcl ]을 사용합니다.)을 사용하는 방법을 알고있는 가장 쉬운 방법이지만, 여러분이 가지고있는 것과는 차이가 없어야합니다.

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

일단 그 바이너리가 빌드되면 Common Lisp 프로그램의 바이너리를 생성하는데 사용할 수있다. 이 작업을 많이 수행하고자한다면 PATH 어딘가에 넣어 두어 모든 디렉토리의 buildapp 로 실행할 수 있습니다.

Buildapp Hello World

가능한 가장 간단한 바이너리를 빌드 할 수 있습니다.

  1. 의존성이 없다.
  2. 명령 줄 인수를 취하지 않습니다.
  3. "Hello world!"라고 씁니다. stdout

buildapp 빌드 한 후에는 ...

$ 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 안녕하세요 웹 세계

더 현실적인 예는 디스크에 여러 개의 파일로 작성하고 프로젝트 (아닌 포함 --eval 에 전달 옵션 buildapp ), 및 끌어 오기 몇 가지 종속성을.

asdf 시스템을 찾거나로드 할 때 임의의 일들이 일어날 수 있기 때문에 (의존하지 않는 다른 시스템을로드하는 것을 포함하여),로드해야하는 것을 찾기 위해 의존하고있는 프로젝트의 asd 파일을 검사하는 것만으로는 충분하지 않습니다 . 일반적인 방법은 quicklisp 을 사용하여 대상 시스템을로드 한 다음 ql:write-asdf-manifest-file 을 호출하여로드 된 모든 항목의 전체 목록을 작성하는 것입니다.

hunchentoot 으로 hunchentoot 된 장난감 시스템은 실제로 이런 일이 일어날 수있는 방법을 보여줍니다.


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

일단 buildapp-hello-web-world 디렉토리에 저장된 파일을 가지고 있다면,

$ 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

위와 같이 주어진다면 여러분이 생각하는 바를 정확히 수행하는 바이너리가 생성됩니다.

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

그런 다음 다른 쉘을 실행하고 curl localhost:4242 하고 Hello Web World! 의 일반 텍스트 응답을 볼 수 있어야합니다 Hello Web World! 인쇄 해.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow