Команда для проверки наличия каких-либо версий диапазона в разделе зависимостей package.json - PullRequest
0 голосов
/ 24 декабря 2018

По сути, я хочу, чтобы CI не работал, если в разделе зависимостей package.json содержится какой-либо оператор диапазона.devDependencies может содержать все мысли.Некоторые команды CLI были бы идеальными.Какие-либо предложения?

1 Ответ

0 голосов
/ 26 декабря 2018

Краткий ответ: К сожалению, для этого не существует встроенной команды / функции npm.Однако вы можете использовать свой собственный скрипт nodejs.Затем сценарий nodejs можно запустить с помощью команды, если вы определите его в разделе scripts вашего package.json .

Ниже описано, как этого добиться.


Решение

  1. check-deps.js

    Создайте скрипт nodejs следующим образом.Давайте назовем скрипт check-deps.js и сохраним его где-нибудь в каталоге вашего проекта.

    const isSemverRange = require('is-semver-range');
    
    const pkgPath = './path/to/your/package.json';
    const pkgData = require(pkgPath);
    
    function hasSemverRange({ dependencies = {}}) {
      return Object.values(dependencies).some(semver => isSemverRange(semver));
    }
    
    if (hasSemverRange(pkgData)) {
      console.log(`Semver range(s) found in dependencies section of ${pkgPath}`);
      process.exit(1);
    }
    

    Объяснение check-deps.js:

    • Во-первыхмы require пакет is-semver-range , который мы будем использовать для проверки любых диапазонов semver .Установить этот пакет;cd в каталог вашего проекта и выполните следующую команду:

      npm i -D is-semver-range
      
    • Затем мы определим путь к файлу package.json (т.е. к файлу, который мыхотите проверить), а затем мы require его содержимое.

      const pkgPath = './path/to/your/package.json'; // <-- Redefine path.
      const pkgData = require(pkgPath);
      

      Примечание: вам необходимо переопределить ваш путь к package.json при необходимости.

    • Определение параметров функции hasSemverRange использует деструктуризацию объекта для распаковки объекта dependencies и назначает пустой объект как значение по умолчанию , чтобы избежать ошибокпроисходит, если в package.json .

      отсутствует раздел dependencies. В теле функции мы передаем объект dependencies методу Object.valuesи используйте метод Array.some(), чтобы проверить, является ли хотя бы одно из значений диапазоном полуавтоматического значения.

      Эта функция возвращает true, если значение какого-либо свойства / ключаdependencies объект находится в качестве диапазона полупериода, в противном случае он возвращает false.

    • Наконец, в if условие условия мы вызываем функцию hasSemverRange, передавая ей проанализированное содержимое в package.json .Если условие truey , мы записываем сообщение об ошибке в консоль и выходим из сценария с ненулевым кодом выхода, например process.exit(1).

  2. package.json

    В разделе scripts вашего package.json определите скрипт следующим образом.Давайте назовем сценарий check-deps:

    "scripts": {
      "check-deps": "node path/to/check-deps.js",
      ...
    }
    

    Примечание: вам необходимо переопределить ваш путь к check-deps.js , если необходимо.

  3. Запуск сценария npm

    Выполните следующую команду через CLI для вызова сценария check-deps:

    npm run check-deps
    

    Если значение какого-либо свойстваопределенный в разделе dependencies вашего package.json - это диапазон полуверсии, в вашей консоли будет отображаться что-то вроде следующей ошибки:

    Semver range(s) found in dependencies section of ./path/to/package.json

  4. Интеграция проверки с вашим инструментом CI.

    Из вашего вопроса неясно, какой инструмент CI вы используете.Однако, как правило, инструменты CI предоставляют функцию, которая позволяет вам вызывать скрипт npm.

    Например, если вы используете Travis CI , вы можете определить сценарий для запуска в вашем .Файл travis.yml выглядит следующим образом:

    .travis.yml

    script:
      - npm check-deps
    
  5. Дополнительное примечание:

    Вы также можете вызвать сценарий npm check-deps через существующий сценарий test, который вы, возможно, уже определили в своем package.json , используя оператор &&.Например:

    "scripts": {
      "check-deps": "node path/to/check-deps.js",
      "test": "yourCurrentTestcommands && npm run check-deps"
      ...
    }
    

    Примечание. В сценарии test над частью yourCurrentTestcommands следует заменить любые команды, которые вы в данный момент выполняете.


...