yogthos/config 在 CIDER 中获取我的环境,但在 lein with-profile 中 运行 时却没有
yogthos/config picking up my env in CIDER, but not when run in lein with-profile
为了这个简单的演示项目,我从我自己的 "config management" 开始。基本上,slurp 将 .edn 文件转换为字符串,然后 edn/read-string 将其转换为映射。它工作正常,但后来我进行了集成测试,这需要不同的配置文件。所以我搜索并找到了这个 yogthos/config 东西,它似乎正是为此而制作的。
快速测试,它似乎在做我想要的。在连接到 REPL 服务器的 Emacs 中进行评估,我可以评估感兴趣的配置值。
(println "HERE IT IS!!: " (:kafka-broker env))
(def p (producer (:kafka-broker env)))
当我编译文件时,它会打印带有配置值的消息。
但是,当我 运行 lein with-profile dev uberjar 时,它就在那里死了,有一个例外,
Caused by: java.lang.IllegalArgumentException: requirement failed: Missing required property 'metadata.broker.list'
at scala.Predef$.require(Predef.scala:233)
,而我为此添加的println,印证了怀疑:
HERE IT IS!!: nil
但是..但是...我确实给了它 with-profile dev..?
lein with-profile dev pprint 输出 看起来 正确,但我可能不知道要查找什么:
...
:resource-paths
("/Users/akarpov/repos/coras/config/dev"
"/Users/akarpov/repos/coras/resources"),
...
最后,这是来自我的 project.clj:
...
:profiles {:prod {:resource-paths ["config/prod"]}
:dev {:resource-paths ["config/dev"]}
:uberjar {:aot :all}}
...
好的,我想我找到了答案(这与我对 project.clj 的实际运作方式缺乏了解有关)
基本上,正如上面评论中指出的那样,运行宁 uberjar 任务确实隐含地运行将其放在某种内置配置文件中。
所以我想好吧,让我们 运行 'repl' 使用开发配置文件完成任务。然后我得到一个关于缺少 nrepl.server 的错误;这是一些内置默认配置文件的隐含部分(lein repl 是 运行ning 很好)。将其添加为明确的内容后,它似乎有效:
:profiles {:prod {:resource-paths ["config/prod"]
:plugins [[cider/cider-nrepl "0.16.0"]]}
:dev {:resource-paths ["config/dev"]
:plugins [[cider/cider-nrepl "0.16.0"]]}
:uberjar {:aot :all}}
解决这个问题后,下一个问题是确保 yberjar 任务不会覆盖我的产品配置文件,因此需要坚持保留该值:
:profiles {:prod {:resource-paths ^:replace ["config/prod"]
:plugins [[cider/cider-nrepl "0.16.0"]]}
为了这个简单的演示项目,我从我自己的 "config management" 开始。基本上,slurp 将 .edn 文件转换为字符串,然后 edn/read-string 将其转换为映射。它工作正常,但后来我进行了集成测试,这需要不同的配置文件。所以我搜索并找到了这个 yogthos/config 东西,它似乎正是为此而制作的。
快速测试,它似乎在做我想要的。在连接到 REPL 服务器的 Emacs 中进行评估,我可以评估感兴趣的配置值。
(println "HERE IT IS!!: " (:kafka-broker env))
(def p (producer (:kafka-broker env)))
当我编译文件时,它会打印带有配置值的消息。 但是,当我 运行 lein with-profile dev uberjar 时,它就在那里死了,有一个例外,
Caused by: java.lang.IllegalArgumentException: requirement failed: Missing required property 'metadata.broker.list'
at scala.Predef$.require(Predef.scala:233)
,而我为此添加的println,印证了怀疑:
HERE IT IS!!: nil
但是..但是...我确实给了它 with-profile dev..?
lein with-profile dev pprint 输出 看起来 正确,但我可能不知道要查找什么:
...
:resource-paths
("/Users/akarpov/repos/coras/config/dev"
"/Users/akarpov/repos/coras/resources"),
...
最后,这是来自我的 project.clj:
...
:profiles {:prod {:resource-paths ["config/prod"]}
:dev {:resource-paths ["config/dev"]}
:uberjar {:aot :all}}
...
好的,我想我找到了答案(这与我对 project.clj 的实际运作方式缺乏了解有关)
基本上,正如上面评论中指出的那样,运行宁 uberjar 任务确实隐含地运行将其放在某种内置配置文件中。
所以我想好吧,让我们 运行 'repl' 使用开发配置文件完成任务。然后我得到一个关于缺少 nrepl.server 的错误;这是一些内置默认配置文件的隐含部分(lein repl 是 运行ning 很好)。将其添加为明确的内容后,它似乎有效:
:profiles {:prod {:resource-paths ["config/prod"]
:plugins [[cider/cider-nrepl "0.16.0"]]}
:dev {:resource-paths ["config/dev"]
:plugins [[cider/cider-nrepl "0.16.0"]]}
:uberjar {:aot :all}}
解决这个问题后,下一个问题是确保 yberjar 任务不会覆盖我的产品配置文件,因此需要坚持保留该值:
:profiles {:prod {:resource-paths ^:replace ["config/prod"]
:plugins [[cider/cider-nrepl "0.16.0"]]}