【问题标题】:Is it possible to set `*warn-on-reflection* in deps.edn?是否可以在 deps.edn 中设置 `*warn-on-reflection*?
【发布时间】:2021-10-31 21:11:06
【问题描述】:

使用leiningen,可以在配置文件 [1] 中重新配置全局变量。 仅在测试等特殊阶段为整个模块启用诸如*warn-on-reflection* 之类的选项很方便。 寻找与 Clojure CLI 相同的方法,我找不到明确的方法。 查看各种命令,例如编译需要以下 clojure -M -e "(compile 'some.namespace)" 的 clojure 代码,我可能不得不求助于类似的技巧。

为了记录,像[2]这样的各种来源都建议将它放在每个文件中,但这很麻烦。

[1]https://github.com/technomancy/leiningen/blob/6c8cdeebb07972f2a24b95bfc64b339c9895d3bc/sample.project.clj#L285-L290
[2]https://github.com/clj-easy/graal-docs#reflection

【问题讨论】:

    标签: clojure


    【解决方案1】:

    后来找到这个其他SO [1]后,似乎这样做的方法如下:

    ; deps.edn
    {:aliases {:my-profile {:main-opts ["-e" "(set! *warn-on-reflection* true)"]}}}
    

    其他-e command 正确接收,如本次测试所示:

    clojure -Mmy-profile -e '(println "warn-on-reflection =" *warn-on-reflection*)'
    ; => warn-on-reflection = true
    

    cmets 中报告的一个缺点是只能应用来自不同别名的一个 :main-opts 选项 - 最后一个获胜。
    对未来有一个希望:ask.clojure.org [2] 上的一个问题要求 JVM 选项。

    我希望这将帮助其他像我一样努力进行转换的人。

    [1]How to set default value for *print-length* in deps.edn
    [2]https://ask.clojure.org/index.php/3787/theres-enable-warn-reflection-from-command-running-clojure

    【讨论】:

    • 值得注意的是,当您将 :main-opts 放在多个别名中时,它们不会合并/合并,因此您无法将命令行上的 :my-profile 别名与以下内容合并,例如例如,尝试通过 -m the.main.namespace 运行代码(例如测试运行器!)——最后一个在 :main-opts 的行为中获胜。此外,如果你想启动一个 REPL,你需要 clj -M:my-profile -r (你需要 -r 告诉 clojure.main 在运行 -e 选项后启动一个 REPL)。
    • 感谢@SeanCorfield 提供更多信息。如果是这样,您对如何合并两个值列表有什么建议吗?这可能是一个新问题的主题,但如果我能以最好的方式更新自我答案,我们都会赢。我注意到了 REPL 的 -r,这是我新认识的。我最初想要一些我可以在构建时启动的东西,但这更像是 Java 思维而不是 clojure,它都以 REPL 为中心。具备所有这些知识后,我将调整我的流程。
    • “如何合并两个列表”——不,:main-opts 处理内置在 CLI 中,tools.deps 以这种方式(最后一个获胜)。因为我不输入 REPL——我总是将编辑器中的代码评估到我正在运行的 REPL 中——我在每个源文件中都只有(set! *warn-on-reflection* true),所以我不必担心这个。如果这是您可以通过 JVM 选项设置的东西,那就太好了,因为它们确实结合了。
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2013-11-25
    • 2015-07-14
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多