2015-07-13 18 views
5

Sto costruendo un'applicazione per il raspberry pi e uso pi4j come dipendenza per Software PWM su GPIO. Mi piacerebbe testare il mio codice sul mio computer locale, quindi mi piacerebbe compilare il mio codice senza la dipendenza pi4j e saltare le chiamate al metodo nella libreria.compilazione condizionale per test/distribuzione build con raspberry pi

codice Esempio:

(ns led-server.model 
    (:require [clojure.tools.logging :as log]) 
    (:import [com.pi4j.wiringpi SoftPwm Gpio])) ;; pi4j dependency, only compiles on rPi 


(defn- soft-pwm-write [pin value] 
    (let [ival (Math/round (double (* value RANGE)))] 
    (SoftPwm/softPwmWrite pin ival) ;; call to pi4j. This is what I want to skip 
    (log/info "pin" pin "set to" ival)) 
) 

pi4j richiede la libreria wiringPi C, che è disponibile solo sul pi lampone (che ha un senso). Per testare la mia macchina di sviluppo sarebbe sufficiente vedere la stampa del registro. Non voglio commentare le chiamate al metodo :import e al test, vorrei una soluzione più elegante.

risposta

3

A parte la questione se la compilazione condizionale è l'approccio migliore qui, non è difficile compilare file condizionalmente con Leiningen: mettere i file che si desidera compilazione condizionale in una cartella diversa da src/CLJ, e definirlo come una cartella di origine in un profilo:

:profiles { 
    :native {:source-paths ["src/native/clj/"]} 
    :mock {:source-paths ["src/mock/clj/"]} 

Poi, leininig correre con profilo:

lein with-profiles +mock repl 

saperne di più visita https://github.com/technomancy/leiningen/blob/master/doc/PROFILES.md

012.

Nella tua situazione, puoi definire un protocollo, fornire 2 implementazioni e assicurarti di caricare solo le classi rilevanti per il tuo ambiente.

+0

Ok pulito, sembra che funzioni. Hai detto che la compilazione condizionale potrebbe non essere il modo giusto per affrontarlo; cosa suggeriresti invece? – quantumbyte

+0

Si può decidere in fase di esecuzione se caricare la classe Pi e, se lo si desidera, fare qualcosa come (-> "com.pi4j.wiringpi.SoftPwm" Class/forName (.getMethod "softPwmWrite" arg-types) (.invoke nil pin vals)). Se non si esegue questo codice, la classe Pi non verrà caricata. Non: importa. –

+0

Ok, grazie, vedrò cosa si adatta meglio, la seconda opzione non sembra però più pulita. – quantumbyte