Как проверить файл узла, получив сообщение об ошибке «EACCES» при порождении функции - PullRequest
0 голосов
/ 04 марта 2020

При создании CLI я хотел бы проверить свою функцию. Для этого я использую модуль child_process .

const path = require('path');
const { execFile } = require('child_process');

describe('cli test', () => {
  test('thing', () => {

    const myCli = execFile(
      `${path.resolve(__dirname, '..')}/cli.js`, ['--foo', 'Bar'],
      (err, stdout, stderr) => {
      if (err) {
        console.log('err: ', err);
      }
    });
});

Но это приводит к следующей ошибке:

Attempted to log "err:  { Error: spawn /projects/cli/src/cli.js EACCES
        at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
        at onErrorNT (internal/child_process.js:415:16)
        at process._tickCallback (internal/process/next_tick.js:63:19)
      errno: 'EACCES',
      code: 'EACCES',

Запуск этого скрипта непосредственно в терминале через команда: $ node cli.js --foo Bar отлично работает.

Теперь советуем chmod +x <file> этот файл ( source ). Но тест также должен работать на CI и на другом компьютере, который использует репо Git.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Я бы предложил использовать fork вместо execFile.

Метод child_process.fork() - это особый случай child_process.spawn(), используемый специально для появления новых Node.js процессов.

Это позволит вам выполнять JS файлы без необходимости их выполнения в оболочке.

0 голосов
/ 04 марта 2020

Насколько мне известно, git фактически отслеживает исполняемый бит для файлов. Однако, как указано в этой статье, есть несколько вещей, которые следует учитывать: https://medium.com/@tahteche / how- git -treats-changes-in-file-permissions-f71874ca239d

Другое решение будет не полагаться на синтаксис выполнения ./ (который требует включения исполняемого бита для соответствующего файла), а вместо этого явно использовать команду оболочки:

const path = require('path');
const { execFile } = require('child_process');

describe('cli test', () => {
  test('thing', () => {

    const myCli = execFile(
      `sh ${path.resolve(__dirname, '..')}/cli.js`, ['--foo', 'Bar'],
      (err, stdout, stderr) => {
      if (err) {
        console.log('err: ', err);
      }
    });
});

Обратите внимание на префикс sh Я добавил к вашему коду: таким образом, вы можете использовать команду sh (которая должна быть доступна во всех ваших средах, например, в CI) для выполнения содержимого файла, независимо от того, может ли сам файл быть выполнен или нет!

...