【问题标题】:TypeScript spawn errorsTypeScript 生成错误
【发布时间】: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/awaitpromisify 的方式有问题。

【问题讨论】:

    标签: node.js typescript async-await


    【解决方案1】:

    原来,错误是因为你的cwd 不存在引起的。 只需更改为{cwd: '/'} 即可让程序在createDirs() 处成功。

    另见https://github.com/nodejs/node/issues/9644#issuecomment-281613121


    我进行了以下更改以使其正常工作:

    1) 改变shebang线路#!/usr/bin/env ts-node
    2)tsconfig.json

    {
      "compilerOptions": {
        "lib": [ "es2015" ]
      }
    }
    

    【讨论】:

      【解决方案2】:

      知道了,原因是在{cwd: this.tmpDir},当命令运行时tmpDir不存在。

      如果在 async/await、exec/spawn 上有任何其他潜在错误或建议 - 请拍。

      【讨论】:

        猜你喜欢
        • 2017-10-18
        • 2022-12-20
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多