我有一个基于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}}。
答案 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
实现。