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

问题描述 投票:2回答:1

我有一个基于JS / Node的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将是我想以某种方式操纵shelljs.which的地方。

javascript node.js command-line-interface
1个回答
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调用ruby都用/usr/bin/ruby回答,所有其他请求都被发送到实际的shelljs.which实现。

© www.soinside.com 2019 - 2024. All rights reserved.