2012-03-23 6 views
7

net.aservebordeaux-threads 위에 응용 프로그램을 빌드한다고 가정 해 봅시다. 내 패키지를 컴파일하기 전에 점액에 (ql:quickload "aserve") (ql:quickload "bordeaux-threads")을 실행할 수 있도록Quicklisp QUICKLOAD는 어디에서 가져와야합니까? 아무데도?

(defpackage :my-package 
    (:use :cl :net.aserve :bordeaux-threads) 
    (:export …)) 

내가 Quicklisp를 사용하고, 모든 것이 괜찮 : 내 패키지 선언은 다음과 같이 나타납니다.

당연히 내일 나는 SLIME을 다시 시작하고 컴파일하기 전에 QUICKLOAD s를 실행해야한다는 것을 기억해야합니다. 그렇지 않으면 문제가 생깁니다.

내가 내 상단에

(eval-when (:compile-toplevel) 
    (ql:quickload "aserve") 
    (ql:quickload "bordeaux-threads")) 

같은 것을 넣을 수있는 패키지 내가가했던 개발 -하지만 난 그것의 패키지 관리자를 강제하는 것은 좋은 생각이 아니다 느낌이 무슨이다 사용자.

더 좋은 방법이 있습니까? 당신의 ASD 파일에서

+1

.clinit.cl 파일에 넣을 수 있습니까? http://www.franz.com/support/documentation/6.2/doc/startup.htm#init-files-1을 참조하십시오. –

+0

@JohnPick Allegro CL을 실행하고 있지는 않지만 그래도 SBCL에 상응하는 기능이있을 수 있습니다. – Ashe

+0

(사실,'.sbclrc') 아마 이것이 내 최선의 방법이라고 생각합니다. 나는 모든 신생 기업에서이 소프트웨어를 실행해야한다는 불쌍한 생각을 가지고 있습니다. 그러나 내 마음 속의 어떤 것이 나에게 찾고있는 사람도 말이되지 않습니다. 따라서 "아무데도?" 질문 제목에서 나는 추측한다! – Ashe

답변

11

, 당신은 아래와 같이 realtion을 따라 정의해야합니다 : 다음 방금 (: 퀵로드 : aserve QL) 필요하면 '

(asdf:defsystem #:aserve 
:serial t 
:depends-on (#:hunchentoot :hunchentoot-cgi 
      #::bordeaux-threads 
      #:parenscript) 
...) 

을'.

+0

나는'aserve'를 쓰고 있지 않다. 나는 그것을 소비하려고 노력하고있다.'(ql : quickload : aserve)'를 수동으로 실행하는 것은 내가 피하려고하는 것이다. – Ashe

+0

@ArlenCuss :'hunchentoot' 또는'bordeaux-threads'와 같은 의존성 목록에'aserve'를 추가하면이 시스템을로드 (또는 빠른로드) 할 때 의존성이로드됩니다. 실제로 그것은 기본적으로 Quicklisp이하는 것입니다. ASDF를 사용하고 누락 된 종속성을 다운로드합니다. – Daimrod

+3

질문에 대한 정답입니다. 받아 들인 대답은 다른 질문에 대한 답입니다 (나는 정확히 무엇이 확실하지 않습니다). – Xach

10

quickproject ((ql:quickload :quickproject)을 통해 액세스 가능)을 사용하여 응용 프로그램을위한 시스템을 만드십시오. z_axis가 설명되면 을 호출 할 때 놓친 경우 defsystem 선언의 종속성 목록을 채울 수 있습니다.

Quicklisp 설치의 local-projects 경로에 새 프로젝트를 만들면 (Quicklisp 배포판에 아직 포함되어 있지 않더라도) 프로젝트를 빠르게로드 할 수 있습니다. 프로젝트를 빠르게로드하면 종속성을 다운로드하고 (Quicklisp 배포판의 일부인 경우)로드합니다.

+0

z_axis (?)와 같이,'.asd '가 같은 디렉토리에있는 한 빨리 퀵로드 할 수 있습니다. – Ashe

+0

프로젝트 디렉토리와 프로젝트 디렉토리가'local-projects' 디렉토리의 직접적인 하위 디렉토리 인 경우. 연결된 블로그 게시물 (http://blog.quicklisp.org/2011/11/november-quicklisp-updates.html)에서 Xach의 지시를 따르십시오. –

+0

와우, '로컬 프로젝트'에서 그 링크를 완전히 놓쳤다. 감사! – Ashe

2

나는 정확히 같은 질문을했으며 사용자에게 패키지 관리자를 강제해서는 안된다는 데 동의합니다. quicklisp 시간 전에 clbuild를 사용하고 있었고 모든 .asd 파일을 systems/디렉토리에 저장했습니다. `systems/'디렉토리가 asdf : central-registry에있는 한 모든 관련 패키지를로드하려면 적어도 SBCL과 CCL에서는 간단히 ("a-package"가 필요합니다). 새로운 clbuild2는 업스트림에서 설치를 수행하는 경우이 기능을 유지하며 통합 된 quicklisp는 별도로 설치된 업스트림 패키지를 존중하지만 설치되어있는 quicklisp 패키지는 더 이상 .asd 파일을 노출하지 않습니다.

내 솔루션은 일반적으로 dists/quicklisp/software /에있는 모든 quicklisp 설치된 패키지를 검색하고 모든 .asd 파일을 중앙 위치에 연결하는 셸 스크립트를 작성하는 것입니다. 이런 식으로 quicklisp이 설치된 패키지 만 사용하려는 경우에는 quicklisp을 cl 이미지로로드 할 필요가 없습니다. quicklisp이 기본적으로이 기능을 제공 할 수 있기를 바랍니다.

2

배치 된 소스 코드에 quicklisp 호출을 포함시키지 않으려는 경우 quickproject 시스템 정의 파일을 나머지 소스와 분리하십시오.

소스 상단, defpackage 전화 직전에 패키지 의존성에 필요한 (require ...)을 추가하십시오. 이것은 그 lisp 패키지가 진행되기 전에 (어떤 식 으로든)로드되기를 보장하지만 패키지가로드되는 방법을 지정하지는 않습니다.그들은 ql:quickload :my-package 호출 (quickproject 사용)을 실행하여로드 할 수 있습니다.이 호출은 먼저 종속성을로드 한 다음 소스를로드 할 때 require 호출을 실행합니다. 또는 아마도 사용자가 ql:quickload을 호출하지 않고 직접 소스를로드 할 수 있으며, 종속성은 *module-search-path*에서 찾을 수있는 경우 요청 호출 중에로드됩니다. 이 기술은 말했듯이 최종 사용자가 소스를로드하려는 빌드 도구를 사용하도록 허용합니다.

quicklisp가 require 함수 호출을 잠급니다. quicklisp이 설치되어 있고 (require :bordeaux-threads) 등이 호출되면 lisp는 quicklisp을 사용하여 해당 종속성을 다운로드하고 설치합니다. 이는 Common Lisp 표준 인 require 함수가 인터페이스 레이어로 작동하도록 허용하고 종속성을 충족시키는 데 사용되는 특정 빌드 도구를 추상화하므로 매우 유용한 기능 (IMO)입니다. Quicklisp은 요구 사항, IIRC (asdf latch)에 래치 할 수 있습니다.

질문에 대답하기 위해 quicklisp 호출은 배포 된 소스 코드의 어느 곳으로도 이동해서는 안되며, 종속성로드를 위해 requires을 사용해야합니다. 패키지 정의 파일이 평가되기 전에. 누군가가 패키지 정의 파일을로드하기 전에 quicklisp을 설치 한 경우 quicklisp을 사용하여 종속성을 다운로드하고 설치함으로써 요구 사항을 충족시킬 수 있습니다. 누군가가 asdf를 설치했다면, 그 의존성은 그 빌드 도구에 만족 될 것입니다. 그리고 누군가가 이미 의존성을 설치 한 경우 (다른 기술을 사용하여), 요구는 단순히 넘어 가게됩니다.