2015-07-13 37 views
5

Buduję aplikację dla raspberry pi i używam pi4j jako zależności dla Software PWM na GPIO. Chciałbym przetestować mój kod na moim komputerze lokalnym, więc chciałbym skompilować mój kod bez zależności pi4j i pominąć wywołania metody do biblioteki.Kompilacja warunkowa dla test/deploy kompilacji z raspberry pi

Przykład Kod:

(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 wymaga biblioteki wiringPi C, która jest dostępna tylko w pi malinową (co ma sens). Do testowania na mojej maszynie dev wystarczy wydruk dziennika. Nie chcę komentować :import i metod wywoływania testów, chciałbym bardziej eleganckiego rozwiązania.

Odpowiedz

3

Niezależnie od kwestii, czy kompilacja warunkowa jest najlepszym rozwiązaniem tutaj, to nie jest trudne do kompilacji plików warunkowo z Leiningen: umieścić pliki, które chcesz, aby skompilować warunkowo w innym folderze niż src/CLJ i zdefiniować go jako folder źródłowy w profilu:

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

Następnie uruchom leininig z profilu:

lein with-profiles +mock repl 

zobacz więcej na https://github.com/technomancy/leiningen/blob/master/doc/PROFILES.md

W swojej sytuacji możesz zdefiniować protokół, dostarczyć 2 implementacje i upewnić się, że ładujesz tylko klasy odpowiednie dla twojego środowiska.

+0

Ok porządek, to wygląda na to, że może działać. Wspomniałeś, że kompilacja warunkowa może nie być właściwym sposobem rozwiązania tego problemu; co byś zamiast tego zaproponował? – quantumbyte

+0

W czasie wykonywania można zdecydować, czy załadować klasę Pi i, jeśli trzeba, zrobić coś takiego jak (-> "com.pi4j.wiringpi.SoftPwm" Class/forName (.getMethod "softPwmWrite" arg-types) (.invoke zero pin vals)). Jeśli nie wykonasz tego kodu, klasa Pi nie zostanie załadowana. Nie: importuj. –

+0

OK dzięki, zobaczę, co pasuje lepiej, druga opcja nie wydaje się jednak czystsza. – quantumbyte