【问题标题】:How to connect a ClojureScript node REPL to my :node-library shadow-cljs project?如何将 ClojureScript 节点 REPL 连接到我的 :node-library shadow-cljs 项目?
【发布时间】:2019-09-23 10:52:38
【问题描述】:

上下文

我正在使用 ClojureScript 和 shadow-cljs 构建一个 Node.js 库。
所有开发都是使用 ClojureScript 完成的,但构建工件是一个 NPM 包。示例:

(ns com.example.answer)

(defn answer [] 42)

构建...发布...然后

const answer = require('answer');
answer(); //=> 42

注意:我最近向this post 提供了构建设置的详细信息。

我的整个开发环境都在一个 Docker 容器中,我正在使用“Visual Studio Code Remote - Container”扩展。

“问题”

我的构建设置运行良好(至少我是这么认为的!)但我希望实现更快的开发反馈周期。
换句话说:我不想仅仅为了测试几行更改而重建整个 NPM 包。

完美世界 又名“问题”

在一个完美的世界里,我应该能够打开一个 REPL 并能够随时评估我的 ClojureScript 代码。

无论我如何尝试到达那里,我似乎都被同样的潜在问题所阻止:

没有应用程序连接到 REPL 服务器。确保您的 JS 环境已加载您编译的 ClojureScript 代码。

我尝试了什么

  1. 仅限shadow-cljs

    给定以下shadow-cljs.edn 文件:

    ;; shadow-cljs configuration
    {:source-paths
    ["src"]
    
    :builds
    {:lib {:target :node-library
            :output-to "dist/index.js"
            :exports {:citation citegen.processor.main/citation}}}}
    

    第一次观看:

    root@97db64e5dfa3:/workspaces/citegen# cd packages/csl-processor/
    root@97db64e5dfa3:/workspaces/citegen/packages/csl-processor# yarn shadow-cljs cljs-repl lib
    yarn run v1.17.3
    $ /workspaces/citegen/node_modules/.bin/shadow-cljs cljs-repl lib
    shadow-cljs - config: /workspaces/citegen/packages/csl-processor/shadow-cljs.edn  cli version: 2.8.52  node: v12.10.0
    shadow-cljs - socket connect failed, server process dead?
    shadow-cljs - updating dependencies
    ...
    shadow-cljs - dependencies updated
    shadow-cljs - server version: 2.8.52 running at http://localhost:9630
    shadow-cljs - nREPL server started on port 36017
    [0:0]~cljs.user=>
    

    然后在另一个终端:(注意错误信息)

    root@97db64e5dfa3:/workspaces/citegen# cd packages/csl-processor/
    root@97db64e5dfa3:/workspaces/citegen/packages/csl-processor# yarn shadow-cljs cljs-repl lib
    yarn run v1.17.3
    $ /workspaces/citegen/node_modules/.bin/shadow-cljs cljs-repl lib
    shadow-cljs - config: /workspaces/citegen/packages/csl-processor/shadow-cljs.edn  cli version: 2.8.52  node: v12.10.0
    shadow-cljs - connected to server
    [1:1]~cljs.user=> (inc 41)
    No application has connected to the REPL server. Make sure your JS environment has loaded your compiled ClojureScript code.
    
  2. 使用 VS 代码Calva:

    给定与上述相同的shadow-cljs.edn 文件:

    当我尝试使用Calva: Load current namespace in REPL window 手动加载命名空间时,我得到了同样的错误:

    没有应用程序连接到 REPL 服务器。确保您的 JS 环境已加载您编译的 ClojureScript 代码。

问题:我如何到达那个完美的世界?

【问题讨论】:

    标签: node.js clojurescript shadow-cljs vscode-calva


    【解决方案1】:

    多亏了 Thomas Heller,我才得以成功。

    我没有意识到我需要运行一次构建工件才能连接到 REPL。

    这将有效地消除此错误:

    没有应用程序连接到 REPL 服务器。确保您的 JS 环境已加载您编译的 ClojureScript 代码。

    步骤

    1. 在 VS Code 中打开任何 ClojureScript 文件
    2. CMDSHIFTp 并选择Calva: Start a project REPL and connect (aka Jack-in)
    3. 等到 REPL 窗口打开
    4. 然后,打开一个新终端并要求您的构建工件,以便连接到 REPL。例如node -e "require('./dist')"
    5. 在 REPL 中打开任何要评估的 ClojureScript 文件,按 CMDSHIFTp 并选择 Calva: Load current namespace in the REPL window

    我在下面附上了一个截屏视频。如您所见:

    • CLJS REPL 窗口中的命名空间不再设置为 undefined
    • 对 ClojureScript 文件的任何更改都会自动重新编译并在 REPL 中可用

    【讨论】:

    • 这是一篇不错的文章。这将是对 Calva wiki 的一个非常好的贡献。可能作为名为“与 shadow-cljs 一起使用”的新页面上的第一个内容,或者其他什么。只是说'。
    【解决方案2】:

    我建议阅读REPL Troubleshooting 上的手册部分。

    您很可能想运行shadow-cljs node-repl。这将启动一个带有连接的托管运行时的 REPL。否则,您需要运行节点来加载由:node-library 生成的代码,如手册中所述。

    如果您愿意,可以手动执行此操作,方法是运行 node,然后运行 ​​require("./dist/index.js")。完成后,cljs-repl 将能够进行评估。

    【讨论】:

    • 谢谢!你的回答触发了我的“啊哈”时刻;我没有意识到需要编译的 Node.js 模块会连接到 REPL。我会写一个对我有用的答案。
    • 对于任何人的信息,Calva 可让您快速访问以连接node-repl。在 Jack-in/connect 中,当提示连接到哪个 REPL 时,选择 node-repl 而不是构建 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2019-09-29
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多