有一个在 Node 上运行的 CLI,可以通过以下方式执行command
在命令行上。在其代码中,通过以下方式对 Windows 用户停用了某些功能if (process.platform === 'win32') { process.exit(1); }
。现在我想禁用此检查,并允许 Windows 用户使用“隐藏”功能(通常 Windows 上没有安装所需的软件,但我有一个特殊的设置)。
有没有什么方法可以欺骗这个 CLI 并模拟它正在运行,例如Linux 还是 macOS?
当然,我可以分叉 CLI,删除检查并使用我自己的版本 - 但这需要为每个版本重复此过程。由于此功能也应该可供其他用户使用,因此我必须发布分叉和修改后的 CLI,这可能是其用户经常感到困惑的原因(版本号怎么样?我是否使用相同的 CLI)command
?) - 99.9% 的代码将保持不变。
我可以编写自己的 CLI,它会“伪造”环境,然后执行已安装的原始 CLI,然后进行清理吗?
我创建了一个示例包,其工作方式与 CLI 相同,但仅执行我正在研究的部分:
- https://github.com/janpio/nodejs-cli-nowin https://github.com/janpio/nodejs-cli-nowin
-
https://www.npmjs.com/package/nodejs-cli-nowin https://www.npmjs.com/package/nodejs-cli-nowin
安装通过npm i -g nodejs-cli-nowin
.
基本上,应该使用包装器包而不是原始包来提供入口点。process.platform
在原始包运行之前应该用新值进行模拟。
包装器包/index.js
Object.defineProperty(process, 'platform', { value: 'linux' });
require('original-package/bin/entry-point.js');
如果原始包生成子进程,这不会影响子进程。
这并不能保证该包能够在模拟平台上按预期工作,很可能不会。即使包本身工作正常,这也可能会导致依赖于包依赖项的不可预测的行为process.platform
.
为了影响process.platform
仅适用于特定模块,platform
全局变量应该被局部变量遮蔽。为此,应修改模块包装函数:
const Module = require('module')
const escapedPatchedModulePath = require.resolve('original-package/module-to-patch.js')
.replace(/\\/g, '\\\\');
Module.wrapper[0] += `
const isPatchedModule = __filename === "${escapedPatchedModulePath}";
let process = isPatchedModule
? Object.create(global.process, { platform: { value: 'linux' } })
: global.process;
`;
require('original-package/bin/entry-point.js');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)