【发布时间】:2018-07-19 05:00:45
【问题描述】:
我正在将一些 bash 脚本移植到 TypeScript。其中大部分是对 curl、tar、mkdir 等系统实用程序的顺序调用...
这可能是新手错误,但需要帮助找出这个单一文件 TypeScript 代码中的 spawn/exec 调用有什么问题:
#!/sbin/ts-node
import * as child from 'child_process';
const { promisify } = require('util');
const exec = promisify(child.exec);
const basePkgDir = process.env.HOME + '/cross/pkg';
const baseTmpDir = process.env.HOME + '/cross/tmp';
class Formula {
private pkgDir: string;
private tmpDir: string;
constructor(public name: string, public version: string, public url: string) {
this.url = url.replace(/\${pkgver}/gi, version)
const pkgName = name + '-' + version;
this.pkgDir = basePkgDir + '/' + pkgName;
this.tmpDir = basePkgDir + '/' + pkgName;
}
private async run(cmd: string) {
await exec(cmd, {cwd: this.tmpDir}, (error: Error, stdout: string, stderr: string) => {
console.log(stdout);
if (error)
console.log(error);
if (stderr)
console.log(stderr)
});
}
private async createDirs() {
this.run(`mkdir -p ${this.pkgDir}`);
this.run(`mkdir -p ${this.tmpDir}`);
}
private async download() {
this.run(`curl -LJO ${this.url}`);
}
public async process() {
await this.createDirs();
await this.download();
}
}
async function main() {
const xz = new Formula('xz', '5.2.3', 'https://github.com/xz-mirror/xz/archive/v${pkgver}.tar.gz');
await xz.process();
}
main().then(
text => {
console.log('Done.');
},
err => {
// Deal with the fact the chain failed
console.log(err)
}
);
运行脚本会出现以下错误:
{ Error: spawn /bin/sh ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:229:19)
at onErrorNT (internal/child_process.js:406:16)
at process._tickCallback (internal/process/next_tick.js:63:19)
at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
at Object.<anonymous> (/usr/lib/node_modules/ts-node/src/bin.ts:147:12)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
errno: 'ENOENT',
code: 'ENOENT',
syscall: 'spawn /bin/sh',
path: '/bin/sh',
spawnargs: [ '-c', 'mkdir -p /home/alex/cross/pkg/xz-5.2.3' ],
cmd: 'mkdir -p /home/alex/cross/pkg/xz-5.2.3' }
{ Error: spawn /bin/sh ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:229:19)
at onErrorNT (internal/child_process.js:406:16)
at process._tickCallback (internal/process/next_tick.js:63:19)
at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
at Object.<anonymous> (/usr/lib/node_modules/ts-node/src/bin.ts:147:12)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
errno: 'ENOENT',
code: 'ENOENT',
syscall: 'spawn /bin/sh',
path: '/bin/sh',
spawnargs: [ '-c', 'mkdir -p /home/alex/cross/pkg/xz-5.2.3' ],
cmd: 'mkdir -p /home/alex/cross/pkg/xz-5.2.3' }
Done.
{ Error: spawn /bin/sh ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:229:19)
at onErrorNT (internal/child_process.js:406:16)
at process._tickCallback (internal/process/next_tick.js:63:19)
at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
at Object.<anonymous> (/usr/lib/node_modules/ts-node/src/bin.ts:147:12)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
errno: 'ENOENT',
code: 'ENOENT',
syscall: 'spawn /bin/sh',
path: '/bin/sh',
spawnargs:
[ '-c',
'curl -LJO https://github.com/xz-mirror/xz/archive/v5.2.3.tar.gz' ],
cmd:
'curl -LJO https://github.com/xz-mirror/xz/archive/v5.2.3.tar.gz' }
我怀疑这里使用 async/await 或 promisify 的方式有问题。
【问题讨论】:
标签: node.js typescript async-await