Javascript 如何操作`shell.which()`返回的内容?
我有一个基于JS/Node的CLI,它最初是为在macOS和Linux上运行而开发的。我现在想让它在Windows上运行,但由于复杂和固定的原因,我必须在不更改应用程序源代码的情况下实现这一点 第一步是将原始CLI包装到另一个CLI中,然后在Windows上实际使用,这非常有效(由@estus建议) 现在,我无意中发现了一些运行Javascript 如何操作`shell.which()`返回的内容?,javascript,node.js,command-line-interface,Javascript,Node.js,Command Line Interface,我有一个基于JS/Node的CLI,它最初是为在macOS和Linux上运行而开发的。我现在想让它在Windows上运行,但由于复杂和固定的原因,我必须在不更改应用程序源代码的情况下实现这一点 第一步是将原始CLI包装到另一个CLI中,然后在Windows上实际使用,这非常有效(由@estus建议) 现在,我无意中发现了一些运行shelljs.which('ruby'),并将结果与特定字符串(/usr/bin/ruby)进行比较的代码,这些代码会输出错误消息,甚至在不匹配时使程序失败。我还不知道
shelljs.which('ruby')
,并将结果与特定字符串(/usr/bin/ruby
)进行比较的代码,这些代码会输出错误消息,甚至在不匹配时使程序失败。我还不知道如何克服这一点
如何操作shell.which()
返回的内容
我可以采取的一种方法是操纵
require('shelljs')
来加载我自己的shelljs
分支,它返回我想要的任何东西(通过使用,我已经用cross-spawn
替换了child\u-process
,在Windows上运行得更好)。但是我当然不想维护自己的shelljs
分支,如果我能以某种方式操纵shelljs,那就更实际了
我创建了一个超小型的演示项目,它类似于我正在使用的CLI,可以用来试验可能的解决方案:-fake.js
将是我想要操纵shelljs的地方。它以某种方式。在@Berdi的帮助下,我在评论中发现,类似于我如何能够,我还可以使用shelljs。其中方法:
// Manipulate shelljs.which('ruby')
const shelljs = require('shelljs')
var original_which = shelljs.which
var new_which = function(cmd) {
if(cmd == 'ruby') {
return "/usr/bin/ruby"
}
return original_which.call(this, cmd)
}
shelljs.which = new_which
require("./index.js");
(假设原始CLI位于/index.js
)
在这里,使用参数ruby
对shelljs.which
的所有调用都用/usr/bin/ruby
进行响应,所有其他请求都发送到实际的shelljs.which
实现。的方式与您修改的过程
完全相同。你加载模块,用你自己的版本覆盖which
方法,然后加载应用程序的其余部分。因此,我不是require('module')
而是require('shelljs')
,然后直接(如何?)处理其中的,然后require
forshelljs
不会覆盖它吗?我担心我似乎对代码理解得不够透彻。require('shelljs')
会被缓存并始终返回相同的模块对象,因此您可以更改它。(如果它使用类实例,那么修改内容可能会变得更复杂一些)。但一般来说,你可以在如何做上搞乱它。是的,这正是我所建议的(可能除了original_which.call(this,cmd)
):-)你应该这样做。使用call
确保调用原始方法时将shelljs
对象作为其this
值,这可能很重要,但您需要查看原始which
方法的实际实现,以满足其需求