如何使节点模块在Purescript REPL中可用?

时间:2019-06-30 20:28:55

标签: purescript

通过pulp repl运行时是否可以使所有节点模块可用?似乎只有通过pulp run调用时才起作用。

我正在遵循Purescript书中的模式:https://github.com/paf31/purescript-book/blob/master/text/chapter12.md

exports.fooImpl = function(onSuccess, onFailure) {
    return function() {
        require('some-lib').doThing(function(error, data) {
            if (error) onFailure(error.code)()
            else onSuccess(data)();
        }

    }
}

纯文字定义:

foreign import fooImpl
  :: Fn2 
      (String -> Effect Unit)
      (ErrorCode -> Effect Unit)
      (Effect Unit)

foo:: (Either ErrorCode String -> Effect Unit) -> Effect Unit
foo path k =
  runFn3 readFileImpl
         path
         (k <<< Right)
         (k <<< Left)

现在,如果我跳入REPL

pulp repl 

并尝试调用我的函数,尝试调用所需的库时出现错误。 .xxx is not a function

但是,如果我通过pulp run运行,那么一切都会按预期运行,并且调用节点库函数不会出现问题。

类似地,如果我运行一个节点repl并直接调用该库,我同样不会遇到任何问题。

有趣的是,并非所有节点库都存在此问题。像fs这样的内置插件可以正常工作,但是第三方插件则代表了麻烦。

在REPL中运行时,是否有办法使这些库可用?

2 个答案:

答案 0 :(得分:0)

您有可复制的示例吗?这个对我有用。我将以https://github.com/nonbili/purescript-msgpack-msgpack为例。在仓库目录中启动pulp repl

PSCi, version 0.12.5
Type :? for help

> import Msgpack
> encode' { x: 1 }
"¡x\1"

encode'的实现是

-- Msgpack.purs
foreign import encodeToString_ :: Json -> String
encode' :: forall a. EncodeJson a => a -> String
encode' = encodeToString_ <<< encodeJson

// Msgpack.js
var msgpack = require("@msgpack/msgpack");

exports.encodeToString_ = function(json) {
  return uint8ArrayToString(msgpack.encode(json));
};

答案 1 :(得分:0)

我相信这是用户错误引起的名称冲突。

编辑:

我现在意识到,这完全是由 module 名称驱动的。只要这与node_modules库没有冲突,一切看起来就很好。

意思是即使您直接在文件系统上隐藏名称。例如

npm install SomeLibrary
node_modules/SomeLibrary/

并具有一个反映名称的purescript目录结构

src/SomeLibrary/SomeLibrary.js
src/SomeLibrary/SomeLibrary.purs
src/main

只要Purs文件中的 module 名称与node_modules库名称1:1不匹配,就可以了

module SomeLibraryPurescript where ... 

好的。

module SomeLibrary where ...

失败

我用purescript创建了一个文件结构,该文件结构遮盖了node_modules名称。

src/MyLibrary/MyLibrary.js
src/MyLibrary/MyLibrary.purs
src/Main.purs 

当purescript填充.psci_modules时,它进入了我的MyLibrary模块,这似乎阻止了它找到 actual node_modules模块。

我通过

解决了这个问题
  1. 清除output/.psci_modules/目录
  2. 将我尝试使用FFI包装的库移动到Data/目录中
  3. pulp repl

结果目录结构: