Условный скрипт NPM (Windows / Mac) должен выполнять разные команды) - PullRequest
0 голосов
/ 27 апреля 2018

Вариант использования:

Я устанавливаю prepublishOnly ловушку в NPM, которая удаляет папку "lib", затем переносит исходные файлы машинописного текста в новую папку lib и затем запускает тест.

Проблема:

Предполагается, что два человека опубликуют пакеты NPM, оба работают на разных ОС (Windows / Mac). Поэтому команды для удаления папок разные.

  "scripts": {
    "build": "tsc",
    "clean": "rm -rf lib",
    "clean:windows": "if exist lib rmdir /s /q lib",
    "lint": "tslint --project tsconfig.json --format stylish src/**/*.ts",
    "format": "prettier --write \"**/*.ts\""
  },
  "husky": {
    "hooks": {
      "pre-push": "npm run clean:windows && npm run build && npm run test"
    }
  },

Вопрос:

Есть ли способ запустить сценарии NPM условно (в зависимости от используемой ОС) или есть команда удаления папки, которая работает в этих ОС?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Добавление gulp в ваш список инструментов кажется довольно ненужным, если все, что вы хотите сделать, это удалить папку (-ы) с помощью сценария npm кроссплатформенным способом. Для облегченного решения рассмотрите следующие два решения:


Раствор 1

Взгляните на rimraf , он описывается как:

Команда UNIX rm -rf для узла.

Использование

  1. cd в каталог проекта и выполните следующую команду:

    npm install rimraf --save-dev
    
  2. Измените ваш clean скрипт в package.json на следующее:

    "scripts": {
      "clean": "rimraf lib",
      ...
    },
    
  3. Удалите сценарий clean:windows из вашего package.json, поскольку теперь он является избыточным.

Примечание У меня не было большого успеха при установке его в качестве локальной зависимости, поэтому я использую решение два ниже. Однако вы можете добиться большего успеха - так что стоит попробовать.


Решение 2

В следующем решении используется команда shelljs rm, аналогичная команде Unix rm -rf, за исключением узла - следовательно, это кроссплатформенный эквивалент.

Следующие шаги показывают, как этого можно достичь:

  1. cd в каталог проекта и установите shelljs , выполнив следующую команду:

    npm install shelljs --save-dev
    
  2. Создайте собственный скрипт узла следующим образом, назовем файл clean.js:

    const shell = require('shelljs');
    
    process.argv.slice(2).forEach(function(_path) {
      shell.rm('-rf', _path);
    });
    

    и сохраните его в скрытом каталоге с именем .scripts в корневом каталоге проектов. Например:

    .
    ├── .scripts
    │   └── clean.js
    ├── lib
    │   └── ...
    ├── node_modules
    │   └── ...
    ├── package.json
    ├── src
    │   └── ...
    └── ...
    
  3. Замените ваш clean скрипт в package.json на следующий:

    "scripts": {
      "clean": "node .scripts/clean lib",
      ...
    },
    

    Вы также можете передать несколько аргументов пути в clean.js. Например:

    "scripts": {
      "clean": "node .scripts/clean lib another/folder/path foo/bar",
      ...
    },
    

    Пути к файлам тоже обрабатываются. Например:

    "scripts": {
      "clean": "node .scripts/clean path/to/quux.js",
      ...
    },
    
  4. Удалите сценарий clean:windows из вашего package.json, поскольку теперь он является избыточным.

Примечания

  1. clean.js использует встроенные узлы process.argv для получения массива аргументов командной строки, передаваемых узлу при запуске сценария.

  2. Затем мы slice () массив аргументов из индекса 2, чтобы обеспечить включение только аргументов пути к папке / файлу (например, lib).

  3. Наконец, мы зацикливаемся на каждом пути к папке в массиве, используя forEach() и вызываем shell.rm('-rf', _path); на каждом обороте цикла для удаления ресурса.

0 голосов
/ 27 апреля 2018

Способ устранения подобных проблем заключается в использовании gulp для определения набора специфичных для ОС задач, потому что код, который вы пишете там, не зависит от ОС.

Вам нужно будет установить gulp в качестве зависимости и создать gulpfile.js в корневом каталоге. В нем определите задачу по удалению папки.

var gulp = require('gulp'),
    path = require('path'),
    fs = require('fs-extra');

const rootFolder = path.join(__dirname);
const libFolder = path.join(rootFolder, 'lib');

gulp.task('clean:lib', function () {
  return deleteFolder(libFolder);
});

function deleteFolder(folder) {
  return fs.removeSync(folder);
}

gulp.task('deleteLib', ['clean:lib']);

Затем в вашем package.json скрипте вы можете сделать && gulp deleteLib. ( Убедитесь, что используемые пакеты в вашем gulpfile установлены как dev-зависимости в вашем package.json! )

Код не проверен и написан на моей голове, но это просто для того, чтобы дать вам общее представление.

...