Javascript 如何操作`shell.which()`返回的内容?

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)进行比较的代码,这些代码会输出错误消息,甚至在不匹配时使程序失败。我还不知道

我有一个基于JS/Node的CLI,它最初是为在macOS和Linux上运行而开发的。我现在想让它在Windows上运行,但由于复杂和固定的原因,我必须在不更改应用程序源代码的情况下实现这一点

第一步是将原始CLI包装到另一个CLI中,然后在Windows上实际使用,这非常有效(由@estus建议)

现在,我无意中发现了一些运行
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
for
shelljs
不会覆盖它吗?我担心我似乎对代码理解得不够透彻。
require('shelljs')
会被缓存并始终返回相同的模块对象,因此您可以更改它。(如果它使用类实例,那么修改内容可能会变得更复杂一些)。但一般来说,你可以在如何做上搞乱它。是的,这正是我所建议的(可能除了
original_which.call(this,cmd)
):-)你应该这样做。使用
call
确保调用原始方法时将
shelljs
对象作为其
this
值,这可能很重要,但您需要查看原始
which
方法的实际实现,以满足其需求