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

qua*_*yte 5 build clojure conditional-compilation leiningen

我正在构建一个覆盆子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))
  )
Run Code Online (Sandbox Code Playgroud)

pi4j需要wiringPi C库,它只能在树莓派上使用(这很有意义).要在我的开发机器上进行测试,只需查看日志打印输出即可.我不想评论:import和方法调用测试,我想要一个更优雅的解决方案.

Ass*_*lov 3

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

:profiles {
    :native {:source-paths ["src/native/clj/"]}
    :mock {:source-paths ["src/mock/clj/"]}
Run Code Online (Sandbox Code Playgroud)

然后,使用配置文件运行 leiniig:

lein with-profiles +mock repl
Run Code Online (Sandbox Code Playgroud)

查看更多信息https://github.com/technomancy/leiningen/blob/master/doc/PROFILES.md

根据您的情况,您可以定义一个协议,提供 2 个实现,并确保仅加载与您的环境相关的类。