2015-07-13 4 views
5

Je construis une application pour le pi de framboise et utilise pi4j comme dépendance pour le logiciel PWM sur GPIO. Je voudrais tester mon code sur ma machine locale, donc je voudrais compiler mon code sans la dépendance de pi4j et passer les appels de méthode à la bibliothèque.compilation conditionnelle pour test/deploy build avec framboise pi

code Exemple:

(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 nécessite la bibliothèque wiringPi C, qui est disponible uniquement sur le pi de framboise (ce qui est logique). Pour tester sur ma machine dev il suffirait de voir l'impression du journal. Je ne veux pas commenter les :import et les appels de méthode pour les tests, je voudrais une solution plus élégante.

Répondre

3

En dehors de la question si la compilation conditionnelle est la meilleure approche ici, il est difficile de ne pas compiler des fichiers conditionnelle avec Leiningen: mettre les fichiers que vous souhaitez compiler conditionnellement dans un autre dossier que src/CLJ et définir en tant que dossier source dans un profil:

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

Ensuite, exécutez leininig avec profil:

lein with-profiles +mock repl 

Voir plus à https://github.com/technomancy/leiningen/blob/master/doc/PROFILES.md

Dans votre situation, vous pouvez définir un protocole, fournir 2 implémentations et vous assurer de ne charger que les classes correspondant à votre environnement.

+0

Ok, c'est comme si ça pouvait marcher. Vous avez mentionné que la compilation conditionnelle n'est peut-être pas la bonne façon d'aborder cela; que suggérez-vous plutôt? – quantumbyte

+0

Vous pouvez décider à l'exécution s'il faut charger la classe Pi et, si vous le souhaitez, faire quelque chose comme (-> "com.pi4j.wiringpi.SoftPwm" Class/forName (.getMethod "softPwmWrite" arg-types) (.invoke nul val de broche)). Si vous n'exécutez pas ce code, la classe Pi ne sera pas chargée. Ne pas: importer. –

+0

Ok merci, je vais voir ce qui va mieux, la deuxième option ne semble pas plus propre. – quantumbyte