我有一个基于 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
的地方。
最佳答案
在评论中@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
实现。
关于javascript - 如何操纵 `shell.which()` 返回的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54694962/