我的问题的标题是如何从node.js应用程序运行命令行工具,因为我认为这里的答案将适用于可从npm安装的所有命令行实用程序。我已经看到了有关从node.js运行命令行的问题,但它们似乎并不适用于我的情况。具体来说,我正在尝试运行类似于npm的节点命令行实用程序(在如何使用它,但不是它的函数),称为tilemantle。
tilemantle的documentation显示全局安装tilemantle并从命令行运行该程序。
我想要做的是使用npm install tilemantle --save
在本地安装tilemantle作为npm项目的一部分,然后从我的项目中运行tilemantle。
我已经尝试过`tilemantle = require('tilemantle'),但是tilemantle项目中的index.js文件是空的,所以我认为这对任何事情都无济于事。
我尝试了项目node-cmd
const cmd = require('node-cmd');
cmd.run('./node_modules/tilemantle/bin/tilemantle', 'http://localhost:5000/layer/{z}/{x}/{y}/tile.png', '-z 0-11', '--delay=100ms', '--point=37.819895,-122.478674', '--buffer=100mi'
这不会引发任何错误,但它也无效。
我也尝试过子进程
const child_process = require('child_process');
child_process.exec('./node_modules/tilemantle/bin/tilemantle', 'http://localhost:5000/layer/{z}/{x}/{y}/tile.png, -z 0-11 --delay=100ms --point=37.819895,-122.478674 --buffer=100mi'
这也不会引发任何错误,但它也不起作用。
有没有办法让这个工作,所以我可以从我的程序内部运行tilemantle而不需要全局安装?
我可以通过
从我的终端运行tilemantlenode './node_modules/tilemantle/bin/tilemantle', 'http://localhost:5000/layer/{z}/{x}/{y}/tile.png', '--delay=100ms', '--point=37.819895,-122.478674', '--buffer=100mi', '-z 0-11'
如果按照jkwok
的建议运行以下内容child_process.spawn('tilemantle', ['http://myhost.com/{z}/{x}/{y}.png',
'--point=44.523333,-109.057222', '--buffer=12mi', '-z', '10-14'],
{ stdio: 'inherit' });
我收到spawn tilemantle ENOENT
,如果我用./node_modules/tilemantle/bin/tilemantle.js
替换tilemantle,我会spawn UNKNOWN
基于jfriend00's answer,听起来我需要实际产生节点,所以我尝试了以下
child_process.spawn('node', ['./node_modules/tilemantle/bin/tilemantle.js', 'http://myhost.com/{z}/{x}/{y}.png', '--point=44.523333,-109.057222', '--buffer=12mi', '-z', '10-14'], { stdio: 'inherit' });
这给了我错误spawn node ENOENT
这看起来很奇怪,因为我可以从我的终端运行它并检查了我的路径变量,C:\Program Files\nodejs
在我的路径上。
只是为了检查我尝试使用节点的完整路径运行以下内容。
child_process.spawn('c:/program files/nodejs/node.exe', ['./node_modules/tilemantle/bin/tilemantle.js', 'http://myhost.com/{z}/{x}/{y}.png', '--point=44.523333,-109.057222', '--buffer=12mi', '-z', '10-14'], { stdio: 'inherit' });
在没有ENOENT错误的情况下运行,但是它再次无声地失败并且只是没有使我的磁贴服务器变暖。
我正在运行带有Node 6.11.0的Windows 10 x64
答案 0 :(得分:0)
您可以在本地安装任何可执行文件,然后使用child_process运行它。为此,您只需弄清楚可执行文件的确切路径,并将该路径传递给child_process.exec()
或child_process.spawn()
调用。
您最终想要运行的是命令行:
node <somepath>/tilemantle.js
当您在Windows上安装时,如果您运行,它将为您完成大部分操作:
node_modules\.bin\tilemantle.cmd
如果要直接运行js文件(例如在其他平台上),则需要运行:
node node_modules/tilemantle/bin/tilemantle.js
注意,使用child_process,您必须指定实际的可执行文件,在本例中为“node”本身,然后指定您希望运行的js文件的路径。
当然,这都假设节点在您的路径中,因此系统可以找到它。如果它不在您的路径中,那么您还必须使用节点可执行文件的完整路径。
答案 1 :(得分:0)
看起来您正在尝试从运行文件而不是从命令行捕获tilemantle
的输出。如果是这样,我做了以下工作并让它发挥作用。
像您一样在本地安装tilemantle
和child_process
到新的npm项目中,并将以下内容添加到该项目的文件中。
// test.js file
var spawn = require('child_process').spawn;
spawn('tilemantle', ['http://myhost.com/{z}/{x}/{y}.png', '--
point=44.523333,-109.057222', '--buffer=12mi', '-z', '10-14'], { stdio: 'inherit' });
在项目中使用node test.js
运行它。
我在this post中尝试了一堆其他选项,但只能获得上面的选项以打印进度以及其他输出。希望这有帮助!
答案 2 :(得分:-1)
许多命令行实用程序附带一个&#34;编程&#34; API。不幸的是,tilemantle没有,这就是为什么你无法require
代码中的那个模块。
但是,您可以从npm脚本轻松访问本地安装的CLI版本。我对tilemantle一无所知,所以我将使用tldr命令行工具提供一个示例。在你的package.json中:
{
"name": "my-lib",
"version": "1.0.0",
"scripts": {
"test": "tldr curl"
},
"dependencies": {
"tldr": "^2.0.1"
}
}
您现在可以从项目的终端运行npm test
作为tldr curl
的别名。
Per this post,您可以使用global-npm包从代码中运行npm脚本:
const npm = require('global-npm')
npm.load({}, (err) => {
if (err) throw err
npm.commands.run(['test'])
})
瞧,您现在可以以编程方式运行本地安装的CLI(ish),即使它没有为此提供API。