npm - Предаване на аргументи на командния ред към различна част, различна от опашката/края на скрипта

Имам следния скрипт в моя package.json:

{
  "build-dist": "tsc -p src/main/ts/tsconfig.json --outDir build/dist/npm-fs && cp LICENSE.txt README.md build/dist/npm-fs && node scripts/build/build-dist.mjs"
}

Моят скрипт на scripts/build/build-dist.mjs изисква да бъде подаден аргумент от командния ред. Би ли било възможно да има този персонализиран скрипт в началото на тази верига от скриптове и все още да получава и обработва предадени аргументи на командния ред?

{
  "build-dist": "node scripts/build/build-dist.mjs && tsc -p src/main/ts/tsconfig.json --outDir build/dist/npm-fs && cp LICENSE.txt README.md build/dist/npm-fs"
}

Той изисква (и валидира вход) и извежда грешка, ако валидирането е неуспешно и тъй като изисква аргумент от командния ред, трябва да бъде последният извикан скрипт, за да използва правилно аргументите от командния ред. В резултат на това първите два скрипта във веригата tsc -p src/main/ts/tsconfig.json --outDir build/dist/npm-fs && cp LICENSE.txt README.md build/dist/npm-fs винаги се изпълняват, независимо дали проверката е неуспешна или не. Бих предпочел да има поведение при бърз отказ и изпълнението да спре напълно, ако този скрипт изведе грешка.

Този въпрос по същество е дубликат на това. Надявам се, че вече има налична нова функция или може би някой е измислил по-елегантно решение.


person Snap    schedule 29.12.2020    source източник
comment
@RobC Благодаря за линка! Ще трябва да го разгледам повече, когато имам възможност. Изглежда обещаващо, но все пак е по-хакерско, отколкото бих предпочел. Наистина се надявах npm да има по-вградена функция, за да постигне това. Но хей, ако работи, работи и ще бъда повече от доволен от това!   -  person Snap    schedule 29.12.2020
comment
AFAIK няма вградена функция. Ако използвате *nix, увийте скрипта си в функция на обвивката според този пример: "build-dist": "func() { node scripts/build/build-dist.mjs \"$1\" && tsc -p src/main/ts/tsconfig.json --outDir build/dist/npm-fs && cp LICENSE.txt README.md build/dist/npm-fs; }; func". За крос-платформа ще трябва да използвате персонализиран скрипт node.js. Вижте и другия отговор, но това включва задаване на променлива на средата - така че също не е идеално.   -  person RobC    schedule 29.12.2020
comment
За съжаление npm не предоставя, нито възнамерява да предоставя вградена функция, която позволява аргументите да бъдат предавани в средата на скрипта - както е посочено тук.   -  person RobC    schedule 29.12.2020
comment
По дяволите, имах чувството, че може да е така. Това е разочароващо, надявах се да оползотворя съвместимостта му между платформи, като същевременно мога да свързвам adhoc скриптове заедно в package.json. За щастие създаването на персонализирани скриптове за приключване на всичко със сигурност е опция, но някои от API на npm модула са не много удобни за програмно използване   -  person Snap    schedule 29.12.2020


Отговори (1)


Няма вградена функция за това. Инструменти на трети страни може да са от полза.

Ето едно кросплатформено решение:

{
  "devDependencies": {
    "run-z": "^1.6.2",
    "shx": "^0.3.3"
  },
  "scripts": {
    "valid": "run-z --then node scripts/build/build-dist.mjs",
    "tsc": "run-z valid --then tsc -p src/main/ts/tsconfig.json --outDir build/dist/npm-fs",
    "copy": "run-z valid --then shx cp LICENSE.txt README.md build/dist/npm-fs",
    "build-dist": "run-z tsc,copy"
  }
}

След това го стартирайте така:

npm run build-dist -- +valid <your options here>

Обърнете внимание, че задачите tsc и copy ще се изпълняват паралелно една на друга, докато и двете изискват задачата valid да се изпълни първа.

person lorus    schedule 29.12.2020
comment
Благодаря за решението. Има пакет, който да помогне с всичко, трябва да обичам npm. Чудех се дали има естествено решение, колкото по-малко зависимости, толкова по-добре в крайна сметка, но хей, повече от щастлив съм да използвам работата на някой друг :D - person Snap; 29.12.2020