通过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中运行时,是否有办法使这些库可用?
答案 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模块。
我通过
解决了这个问题output/
和.psci_modules/
目录Data/
目录中pulp repl
结果目录结构: