jan*_*pio 5 command-line-interface node.js
有一个在 Node 上运行的 CLI,可以通过command命令行执行。在其代码中,某些功能通过if (process.platform === 'win32') { process.exit(1); }. 现在我想禁用此检查,并允许 Windows 用户使用“隐藏”功能(通常 Windows 上没有安装所需的软件,但我有一个特殊的设置)。
有没有办法欺骗这个 CLI 并模拟它在 Linux 或 macOS 上运行?
当然,我可以分叉 CLI,删除检查并使用我自己的版本 - 但这需要为每个版本重复此过程。由于此功能也应该可供其他用户使用,因此我必须发布分叉和修改后的 CLI,这可能是其用户经常感到困惑的原因(版本号怎么样?我使用相同的吗?command) - 99.9%代码将保持不变。
我可以编写自己的 CLI,它会“伪造”环境,然后执行已安装的原始 CLI,然后进行清理吗?
我创建了一个示例包,其工作方式与 CLI 相同,但仅执行我正在研究的部分:
通过安装npm i -g nodejs-cli-nowin。
基本上,应该使用包装器包而不是原始包来提供入口点。process.platform在原始包运行之前应该用新值进行模拟。
包装器包/index.js
Object.defineProperty(process, 'platform', { value: 'linux' });
require('original-package/bin/entry-point.js');
Run Code Online (Sandbox Code Playgroud)
如果原始包生成子进程,这不会影响子进程。
这并不能保证该包能够在模拟平台上按预期工作,很可能不会。即使包本身工作正常,这也可能会导致依赖于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');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1935 次 |
| 最近记录: |