如何操纵“ shell.which()”返回的内容?

时间:2019-02-14 16:30:26

标签: javascript node.js command-line-interface

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

第一步是lie to the program about its process.platform,它工作得很好by messing with its Module(由@estus建议),并将原始CLI封装在另一个CLI中,然后在Windows上实际使用。

现在,我偶然发现了一些运行shelljs.which('ruby')的代码,并将结果与​​特定的字符串(/usr/bin/ruby)进行比较,并输出错误消息,甚至在不匹配时导致程序失败。我还不知道该如何克服。

如何处理shell.which()返回的内容?


可以采取的一种方法是操纵require('shelljs')以加载自己的shelljs分支,该分支返回我想要的内容(通过使用override-require,我已经用child_process替换了cross-spawn,在Windows上效果更好)。但是我当然想避免维护自己的shelljs分叉-如果我能以某种方式仅操作shelljs.which,这将更加实用。


我创建了一个超小型演示项目,该项目与我正在使用的CLI相似,可用于试验可能的解决方案:https://github.com/janpio/nodejs-cli-wrongruby-fake.js是我要操纵{{ 1}}。

1 个答案:

答案 0 :(得分:0)

在@Berdi的帮助下,我发现与mess with process.platform类似,我也可以使用shelljs.which方法:

// 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中)

在这里,所有对带有参数shelljs.which的{​​{1}}的调用都由ruby应答,所有其他请求都发送到实际的/usr/bin/ruby实现。