2012-03-23 6 views
7

Digamos que construyo una aplicación encima de net.aserve y bordeaux-threads. Mi declaración del paquete podría tener este aspecto:¿A dónde debería ir QuickLock QUICKLOAD en mi fuente? ¿En ninguna parte?

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

utilizo Quicklisp, así que corro (ql:quickload "aserve") (ql:quickload "bordeaux-threads") en BABA antes de compilar mi paquete, y todo está bien.

Por supuesto, mañana volveré a arrancar SLIME y tengo que acordarme de emitir el QUICKLOAD antes de compilar, de lo contrario, tendré problemas.

I podía poner algo como

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

en la parte superior de mi paquete, que es lo que he hecho para el desarrollo, pero tengo la sensación de que no es una buena idea para forzar un administrador de paquetes de un usuario.

¿Existe una mejor alternativa?

+1

¿Puedes ponerlo en tu archivo .clinit.cl? Ver http://www.franz.com/support/documentation/6.2/doc/startup.htm#init-files-1. –

+0

@JohnPick Podría, aunque no estoy ejecutando Allegro CL, pero SBCL probablemente tenga un equivalente. – Ashe

+0

(de hecho, '.sbclrc') Creo que esta es probablemente mi mejor apuesta, tengo la sensación de que es una pena que tenga que ejecutarla en cada inicio, pero algo en el fondo de mi mente me dice que lo que Estoy buscando no tiene sentido, de ahí el "¿En ninguna parte?" en el título de la pregunta, ¡supongo! – Ashe

Respuesta

11

En el archivo ASD, se debe definir el realtion depende de la siguiente manera: ''

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

Después de entonces sólo tiene que (ql: quickload: aserve).

+0

No estoy escribiendo 'aserve', estoy tratando de consumirlo, y simplemente ejecutar' (ql: quickload: aserve) 'manualmente es lo que estoy tratando de evitar. – Ashe

+0

@ArlenCuss: Simplemente agregue 'aserve' a la lista de dependencias como' hunchentoot' o 'bordeaux-threads', luego cuando cargue (o cargue rápidamente) este sistema, cargará las dependencias. En realidad, eso es básicamente lo que hace Quicklisp, usa ASDF y descarga dependencias que faltan. – Daimrod

+3

Esta es la respuesta correcta a la pregunta formulada; la respuesta aceptada es la respuesta a una pregunta diferente (no estoy seguro exactamente qué). – Xach

10

Use quickproject (accesible a través de (ql:quickload :quickproject)) para crear un sistema para su aplicación. Como se describió z_axis, puede completar la lista de dependencias en la declaración defsystem (si omitió alguna cuando llamó al quickproject:make-project).

Si crea su nuevo proyecto en la ruta local-projects de su instalación de Quicklisp, también puede cargar su proyecto rápidamente (incluso si aún no forma parte de la distribución de Quicklisp). La descarga rápida de su proyecto descargará las dependencias (si forman parte de la distribución Quicklisp) y luego las cargará.

+0

Como z_axis implied (?), Puedo cargarlo rápidamente siempre que '.asd' esté en el mismo directorio. – Ashe

+0

En el mismo directorio que su proyecto, y si su directorio de proyectos es un hijo directo del directorio 'local-projects'. Simplemente siga las instrucciones de Xach desde la publicación de blog vinculada (http://blog.quicklisp.org/2011/11/november-quicklisp-updates.html). –

+0

Oh wow, extrañé ese enlace en 'local-projects'. ¡Gracias! – Ashe

2

Tenía exactamente la misma pregunta y acepto que no debería forzar a un administrador de paquetes a un usuario. Antes del tiempo de quicklisp estaba usando clbuild y coloca todos los archivos .asd en un directorio/sistemas. Siempre que el directorio `systems/'esté en asdf: central-registry, se puede simplemente (requiere" a-package "), al menos en SBCL y CCL, cargar todos los paquetes relevantes. El nuevo clbuild2 conserva esta característica si instala desde arriba, y su quicklisp integrado respeta los paquetes instalados separadamente desde la parte superior, pero los paquetes instalados de quicklisp ya no exponen sus archivos .asd.

Así que mi solución es escribir un script de shell que explore todos los paquetes instalados de quicklisp, generalmente en dists/quicklisp/software /, y vincular todos los archivos .asd a un lugar central. De esta forma, no es necesario cargar el quicklisp en la imagen cl si solo se desean usar paquetes instalados de quicklisp. Espero que quicklisp pueda enviar esta característica por defecto.

2

Si no desea incluir una llamada de quicklisp en el código fuente implementado, separe el archivo de definición del sistema de proyecto rápido del resto de la fuente.

En la parte superior de la fuente, justo antes de la llamada defpackage, agregue las (require ...) necesarias para las dependencias de su paquete. Esto garantiza que esos paquetes de lisp se carguen (de alguna manera) antes de continuar, pero no especifica "cómo" se cargan esos paquetes.Podrían cargarse ejecutando la llamada ql:quickload :my-package (usando el proyecto rápido), que primero cargaría las dependencias y luego ejecutaría las llamadas requeridas al cargar la fuente. O posiblemente un usuario podría cargar la fuente directamente (sin llamar al ql:quickload), y las dependencias se cargarían durante la llamada requerida, si esas dependencias se pueden encontrar en el *module-search-path*. Esta técnica, como dijiste, permitiría al usuario final usar cualquier herramienta de compilación que quiera cargar tu fuente.

Después de experimentar con esto durante unos minutos, parece que quicklisp entra en la llamada de función require, de modo que si se instala quicklisp y se llama a (require :bordeaux-threads), lisp utilizará quicklisp para descargar e instalar esa dependencia. Esta es una característica muy buena (IMO), ya que permite que la función estándar require de Common Lisp actúe como capa de interfaz y abstraiga la herramienta de compilación específica utilizada para satisfacer la dependencia. Quicklisp puede engancharse en el requerimiento, asdf se engancha en él (IIRC), etc.

Para responder a su pregunta, las llamadas de quicklisp no deben ir a ninguna parte en el código fuente implementado, y requires se deben usar para asegurar que las dependencias estén cargadas antes de que se evalúe el archivo de definición del paquete. Si alguien tiene instalado quicklisp antes de cargar el archivo de definición del paquete, los requisitos se cumplirán utilizando quicklisp para descargar e instalar las dependencias. Si alguien tiene asdf instalado, esas dependencias estarán satisfechas con esa herramienta de compilación. Y si alguien ya tiene las dependencias instaladas (usando alguna otra técnica), las necesidades simplemente se pasarán por alto.

Cuestiones relacionadas