Запустите еще одно задание пряжи / npm внутри пакета. json без указания пряжи или npm - PullRequest
1 голос
/ 29 февраля 2020

В моем пакете есть задача. json "deploy", которая должна сначала вызвать "build". Я указал это так:

"deploy": "yarn run build; ./deploy.sh",

Проблема в том, что это жесткие коды yarn в качестве менеджера пакетов. Так что, если кто-то не использует yarn, это не сработает. Переключение на npm вызывает аналогичную проблему.

Какой хороший способ добиться этого при сохранении агности c до выбора npm или yarn?

Ответы [ 3 ]

0 голосов
/ 29 февраля 2020

Что если проверить перед запуском?

Вы можете создать новый файл с именем build.sh, и его содержимое будет ниже:

# check if current user installed node environment, if not, auto install it.
if command -v node >/dev/null 2>&1; then
    echo "version of node: $(node -v)"
    echo "version of npm: $(npm -v)"
else
    # auto install node environment, suppose platform is centos, 
    # need change this part to apply other platform.
    curl --silent --location https://rpm.nodesource.com/setup_12.x | sudo bash -
    yum -y install nodejs
fi

npm run build

Тогда ваш скрипт будет:

{
  "deploy": "./build.sh && ./deploy.sh"
}
0 голосов
/ 03 марта 2020

Так что я думаю, что у меня есть гораздо более простое решение:

"deploy": "yarn run build || npm run build; ./deploy.sh",

Единственный реальный недостаток - в случае, когда существует пряжа, но сборка не удалась, тогда также будет иметь место npm run build.

0 голосов
/ 29 февраля 2020

Возможно, это не идеально, но вы можете запустить файл .js в своем проекте root, чтобы выполнить эти проверки ...

Вы можете создать файл в своем проекте root с именем yarnpm.js (или что-то еще) и вызовите указанный файл в вашей команде package.json deploy.

// package.json (trimmed)
"scripts": {
  "deploy": "node yarnpm",
  "build": "whatever build command you use"
},
// yarnpm.js
const fs = require('fs');

const FILE_NAME = process.argv[1].replace(/^.*[\\\/]/, '');

// Command you wish to run with `{{}}` in place of `npm` or `yarn'
// This would allow you to easily run multiple `npm`/`yarn` commands without much work
// For example, `{{}} run one && {{}} run two
const COMMAND_TO_RUN = '{{}} run build; ./deploy.sh';

try {
  if (fs.existsSync('./package-lock.json')) {  // Check for `npm`
    execute(COMMAND_TO_RUN.replace('{{}}', 'npm'));
  } else if (fs.existsSync('./yarn.lock')) {   // Check for `yarn`
    execute(COMMAND_TO_RUN.replace('{{}}', 'yarn'));
  } else {
    console.log('\x1b[33m', `[${FILE_NAME}] Unable to locate either npm or yarn!`, '\033[0m');
  }
} catch (err) {
  console.log('\x1b[31m', `[${FILE_NAME}] Unable to deploy!`, '\033[0m');
}

function execute(command) { // Helper function, to make running `exec` easier
  require('child_process').exec(command,
    (error, stdout, stderr) => {
      if (error) {
        console.log(`error: ${error.message}`);
        return;
      }
      if (stderr) {
        console.log(`stderr: ${stderr}`);
        return;
      }
      console.log(stdout);
    });
}

Надеюсь, это поможет каким-то образом! Приветствия.


РЕДАКТИРОВАТЬ:

... или, если вы хотите параметризовать сценарий yarnpm.js, чтобы сделать его легко многократного использования, и чтобы сохранить все «команды» в файле package.json, вы можете сделать что-то вроде этого ..

// package.json (trimmed, parameterized)
"scripts": {
    "deploy": "node yarnpm '{{}} run build; ./deploy.sh'",
    "build": "node build.js"
},
// yarnpm.js (parameterized)
const COMMAND_TO_RUN = process.argv[2]; // Technically, the first 'parameter' is the third index
const FILE_NAME = process.argv[1].replace(/^.*[\\\/]/, '');

if (COMMAND_TO_RUN) {
  const fs = require('fs');

  try {
    if (fs.existsSync('./package-lock.json')) {  // Check for `npm`
      execute(COMMAND_TO_RUN.replace('{{}}', 'npm'));
    } else if (fs.existsSync('./yarn.lock')) {   // Check for `yarn`
      execute(COMMAND_TO_RUN.replace('{{}}', 'yarn'));
    } else {
      console.log('\x1b[33m', `[${FILE_NAME}] Unable to locate either npm or yarn!`, '\033[0m');
    }
  } catch (err) {
    console.log('\x1b[31m', `[${FILE_NAME}] Unable to deploy!`, '\033[0m');
  }

  function execute(command) { // Helper function, to make running `exec` easier
    require('child_process').exec(command,
      (error, stdout, stderr) => {
        if (error) {
          console.log(`error: ${error.message}`);
          return;
        }
        if (stderr) {
          console.log(`stderr: ${stderr}`);
          return;
        }
        console.log(stdout);
      });
  }
} else {
  console.log('\x1b[31m', `[${FILE_NAME}] Requires a single argument!`, '\033[0m')
}
...