2010-09-21 15 views
6

Digamos que hice un cambio en una biblioteca de Clojure (por ejemplo, agregué un parámetro al token de solicitud en clj-oauth) y deseo usar esa biblioteca modificada en mi proyecto. ¿Cuál es la mejor manera de hacer esto, a menos de compilar la nueva biblioteca como un JAR y copiar eso en mi proyecto lib?¿Cómo usar mis propias versiones de las bibliotecas de Clojure?

Quiero ser capaz de modificar la biblioteca y mi proyecto al mismo tiempo (preferiblemente en el REPL). Si estuviera haciendo esto en Ruby, descargaría y 'requeriría' la gema, luego volvería a abrir esa clase en mi propio origen de proyecto y agregaría o anularía los métodos según fuera necesario.

Respuesta

6

Puede hackear directamente en REPL. Supongamos que tienes incandescente en tu classpath. Comience una REPL. Lo primero que debemos hacer es incorporar las clases de incandes.

user> (require 'incanter.core) 
nil 

Ahora podemos ver la función incanter.core/matrix?

user> (incanter.core/matrix? 2) 
false 

Podemos mirar el código fuente original:

user> (require 'clojure.repl) 
nil 
user> (clojure.repl/source incanter.core/matrix?) 
(defn matrix? 
    " Test if obj is 'derived' incanter.Matrix." 
    ([obj] (is-matrix obj))) 
nil 

Vamos a meter la pata:

Primer cambio al espacio de nombres incanter.core:

user> (in-ns 'incanter.core) 
#<Namespace incanter.core> 

Entonces podemos redefinirlo, usando el código fuente anterior como una cuna:

incanter.core> (defn matrix? [obj] "hello") 
#'incanter.core/matrix? 

Unidad de prueba:

incanter.core> (matrix? 2) 
"hello" 

cambiar de nuevo al espacio de nombres de usuario:

incanter.core> (in-ns 'user) 
#<Namespace user> 

pruébelo:

user> (matrix? 2) 
; Evaluation aborted. 

No existe una definición de usuario/matriz. Lo redefinimos en el espacio de nombres incanter.core.

user> (incanter.core/matrix? 2) 
"hello" 

para experimentar en el repl, está bien sólo para cambiar los archivos de origen y volver a compilar el archivo único (Ck CC en emacs), o si usted está en el espacio de nombres derecha, justo reevaluar la definición .

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Ahora, si queremos que nuestro valioso cambio sea permanente y esté disponible para otros proyectos, depende de cómo esté configurado todo.

Utilizo maven para la gestión de dependencias, por lo que sería una cuestión de modificar el archivo de origen y luego volver a ejecutar el proceso de compilación para que la biblioteca compile la nueva versión e instálela en el repositorio local de maven.

Con un proyecto Maven, que debe ser tan simple como

$ mvn install 

Una nota acerca de los números de versión:

Si realiza modificaciones permanentes y el uso de gestión de la dependencia para coordinar las diferencias, entonces debería cambie el número de versión de su biblioteca, de tal vez 1.2.0 a 1.2.0-johnshack-SNAPSHOT, o algo que es poco probable que colisione con el real cuando desee usar una versión no invertida en otro proyecto. No desearía que una versión modificada encuentre su camino en proyectos en los que no es bienvenida.

Luego modifica sus propios archivos de proyecto para asegurarse de que usa la versión pirateada donde desea, y la próxima vez que inicie su repl, debe obtener el último truco que instaló.

Tendrá que volver a instalar cada vez que desee que los cambios lleguen al repositorio, pero probablemente sea algo bueno.

Desafortunadamente, (y en este punto comencé a desear haber elegido otro ejemplo) Incanter resulta ser un proyecto de Leiningen que se divide en submódulos en una especie de guión ad-hoc , entonces tenemos que descubrir cómo se espera que se instale. El descubrimiento resultó ser bastante difícil, aunque la respuesta es fácil. Leiningen me quema el pelo.

usted puede conseguir la fuente de encantador aquí:

$ git clone http://github.com/liebke/incanter.git

y el archivo fuente pertinente es:

~/embrujamiento/módulos/embrujamiento-core/src/embrujamiento/núcleo. clj

¿Modificarlo para romper la matriz? función, y luego resulta que lo que tiene que hacer es:

Cambie los números de versión en el nivel superior project.clj, y también en el submódulo project.clj.

Luego ejecuta lein install en el directorio incanter-core, y nuevamente en el directorio de nivel superior, y usted tiene que hacerlo en ese orden. No entiendo muy bien por qué.

Por el momento todo esto parece innecesariamente complicado. Estoy (bastante) seguro de que se calmará a medida que las herramientas maduren.

4

Si está usando (o no le importaría usar) cake, consulte la sección de dependencias de subproyectos del archivo README. Creo que podría ser exactamente lo que estás buscando.

-1

Lo cargas a clojars con un nombre diferente, depende de eso.

+1

O utilice un repositorio local de Maven – Greg

+0

Con Leiningen, esto se puede hacer usando 'lein install'. – Mars

Cuestiones relacionadas