Распространяйте аргументы командной строки, используя npm в качестве инструмента сборки

У меня есть пакет npm, который управляет моим репозиторием github и имеет сценарии, которые создают мой публикуемый пакет npm. Из-за характера пакета опубликованный пакет npm (дистрибутив) не может соответствовать пакету моего репозитория (источник). Я приближаюсь к разработке через тестирование и непрерывной интеграции, но учусь этому шаг за шагом. Вот текущий поток, и пока он работает безупречно:

Из командной строки:

> npm run patch
  1. runs npm version patch
    1. This invokes source's preversion,
      1. cleans the distro: npm run clean
      2. runs the tests: npm test
        1. This invokes pretest,
          • npm run build
        2. Runs distro's tests
          • Failure: Errors and process ends
          • Успешно: ветвь завершена,
    2. invokes the source's postversion:
      • git push all commits and tags
  2. runs distro's npm version patch
    1. invokes distro's postversion
      • npm publish

(Источник) package.json

{
    ...,
    "scripts": {
        "patch": "npm version patch && cd dist && npm version patch",
        "minor": "npm version minor && cd dist && npm version minor",
        "major": "npm version major && cd dist && npm version major",
        "preversion": "npm run clean && npm test",
        "clean": /* clean commands */,
        "pretest": "npm run build",
        "test": "cd dist && npm test",
        "postversion": "git push origin --all && git push origin --tags"
    },
    ...
}

(Дистр) package.json

{
    ...,
    "scripts": {
        "test": /* test commands */,
        "postversion": "npm publish"
    },
    ...
}

Хотелось бы более простой интерфейс. Как видите, мне нужно npm run <major|minor|patch>. Вместо этого я хотел бы npm run dist с аргументом командной строки, переданным обеим версиям npm.

Пример:

> npm run dist patch
--------------------
<<< npm version patch
<<< cd dist && npm version patch

> npm run dist major
--------------------
<<< npm version major
<<< cd dist && npm version major

Можно ли передавать аргументы командной строки вниз по дереву? Или, что еще лучше, могу ли я распределить аргумент командной строки между командами в одной записи сценария? Я могу легко добавить запись в scripts, которая принимает аргумент командной строки, но, похоже, не могу понять, как использовать этот аргумент более одного раза, написав отдельный скрипт .js.


person Fuzzical Logic    schedule 03.02.2019    source источник
comment
Работает только на платформах *nix, ваши скрипты npm; patch, minor и major можно заменить на тот, который использует функцию bash, например. "dist": "func () { arg=${1:-patch}; npm version \"$arg\" && cd dist && npm version \"$arg\"; }; func". Через интерфейс командной строки запустите либо: 1) $ npm run dist (примечание: когда аргумент не передается, часть arg=${1:-patch}; в теле func по умолчанию устанавливает аргумент равным patch). 2) Или запустите: $ npm run dist <semver>, при этом <semver> следует заменить на любой; patch, minor или major. Windows cmd.exe явно захлебнется функцией bash. Мои ответы...   -  person RobC    schedule 04.02.2019
comment
здесь и здесь объясните, почему нельзя передать аргументы через CLI в середину скрипта (их можно передать только в конец), и предложите решения для преодоления ограничения npm. Для x-платформы рассмотрите возможность запуска команд npm run с помощью скрипта node.js. Однако в вашем сценарии вы также используете хуки pre и post  -  person RobC    schedule 04.02.2019
comment
К сожалению, при запуске команды npm run через child_process.exec() node.js они выполняются в дочернем процессе, поэтому ваши хуки pre и post будут игнорироваться. По сути, для x-платформы вам нужно будет выложить cmds, чтобы разрешить аргументы в середине npm-скрипта, а также вызвать хуки pre и post из скрипта node.js. Хотя да, вы можете передавать аргументы вниз по дереву в соответствии с этим script#answer-40508801">ответ, ваша основная проблема заключается в передаче аргументов в середину скрипта.   -  person RobC    schedule 04.02.2019
comment
@RobC: я посмотрю ресурсы. Благодарю вас! К сожалению, я на Win, но я могу заставить работать .bat или .cmd. Итак, если я правильно понимаю, хуки перестанут работать, если я использую child_process? Похоже, если я найду решение на чистом npm (что звучит маловероятно), мне, возможно, придется ответить на свой вопрос...   -  person Fuzzical Logic    schedule 04.02.2019
comment
Да, хуки игнорируются. Например, в сценарии nodejs, получающем аргумент с помощью const arg = process.argv[2]';, а затем обрабатывающем ваш cmd с помощью require('child_process').execSync(`npm version ${arg} && cd dist && npm version ${arg}`, { stdio:[0, 1, 2] });, ваши сценарии preversion и postversion не запускались (однако они выполнялись с использованием функции bash, т.е. когда это один и тот же процесс, а не ребенок). Думаю, вам также нужно будет вызывать хуки, например. execSync(`npm run preversion && npm version ${arg} && npm run postversion && cd dist && npm version ${arg}`). Может стоит изучить.   -  person RobC    schedule 04.02.2019
comment
npm-run-all — возможно, вы могли бы что-то сделать с его заполнители аргументов .   -  person RobC    schedule 04.02.2019
comment
@RobC: я бы не возражал против одной или двух зависимостей на основе npm. Идея в том, что у меня есть много веб-компонентов, которые я хотел бы упаковать, поэтому мне нужна стандартная структура. Соглашение для веб-компонентов состоит в том, чтобы упаковать дистрибутив отдельно от исходного кода, что и вызвало это исследование. Если вы можете найти решение, пожалуйста, не стесняйтесь ответить. Я был бы рад помочь адаптировать ответ для других в моем положении в будущем. Ваши комментарии были неоценимы до сих пор.   -  person Fuzzical Logic    schedule 05.02.2019