Build 使用raspberry pi进行测试/部署构建的条件编译

Build 使用raspberry pi进行测试/部署构建的条件编译,build,clojure,leiningen,conditional-compilation,Build,Clojure,Leiningen,Conditional Compilation,我正在为raspberry pi构建一个应用程序,并使用pi4j作为GPIO上软件PWM的依赖项。不过,我希望在本地机器上测试代码,因此我希望编译代码时不使用pi4j依赖项,并跳过对库的方法调用 示例代码: (ns led-server.model (:require [clojure.tools.logging :as log]) (:import [com.pi4j.wiringpi SoftPwm Gpio])) ;; pi4j dependency, only compiles

我正在为raspberry pi构建一个应用程序,并使用pi4j作为GPIO上软件PWM的依赖项。不过,我希望在本地机器上测试代码,因此我希望编译代码时不使用pi4j依赖项,并跳过对库的方法调用

示例代码:

(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需要wiringpic库,它只在raspberry-pi上可用(这是有意义的)。在我的开发机器上进行测试时,只要看到日志打印输出就足够了。我不想注释掉测试的
:import
和方法调用,我想要一个更优雅的解决方案

除了条件编译是否是这里的最佳方法这个问题之外,使用leiningen有条件编译文件并不困难:将要有条件编译的文件放在不同于src/clj的文件夹中,并将其定义为概要文件中的源文件夹:

:profiles {
    :native {:source-paths ["src/native/clj/"]}
    :mock {:source-paths ["src/mock/clj/"]}
然后,使用配置文件运行Leining:

lein with-profiles +mock repl
更多信息请访问


在您的情况下,您可以定义一个协议,提供两个实现,并确保只加载与您的环境相关的类。

好的,看起来它可以工作。您提到,条件编译可能不是解决此问题的正确方法;您的建议是什么?您可以在运行时决定是否加载Pi类,如果需要,可以执行类似(->“com.pi4j.wiringpi.SoftPwm”类/forName(.getMethod“softPwmWrite”arg类型)(.invoke nil pin vals))的操作。如果不执行此代码,则不会加载Pi类。不要:导入。好的,谢谢,我会看看什么更合适,但第二个选项看起来不干净。