Запуск bash-скриптів з npm


77

Я хочу спробувати використовувати npm для запуску різних завдань збірки веб-додатків. Я знаю, що можу це зробити, додавши scriptsполе до свого package.jsonтипу like:

"scripts": {
   "build": "some build command"
},

Це стає громіздким, коли у вас є більш складні команди з безліччю опцій. Чи можна перемістити ці команди в скрипт bash чи щось подібне? Щось на зразок:

"scripts": {
   "build": "build.sh"
},

де npm run buildвиконуватиме команди у build.shфайлі?

Читаючи цю публікацію, здається, що вона є, але мені не ясно, куди саме я маю кинути build.shфайл або якщо чогось мені не вистачає.


17
Не роби цього. Вузол працює скрізь. Баш ні. Що б ви не робили в bash, ви можете робити в node , і навіть виклик CLI можна зробити, використовуючи залежності пакета. Потрібні rm? встановіть rimraf, а потім використовуйте це у сценарії npm . mkdir -p? встановіть, mkdirpа потім використовуйте це у сценарії npm. У вас є універсальна мова сценаріїв , незалежна від платформи , прямо там, тоді не йдіть і не робіть вигляд, що це лише "Nix". Чи занадто ускладнюється командний рядок? Використовуйте програму запуску завдань, як gruntабо gulp. Зберігайте його універсальним.
Майк 'Помакс' Камерманс

1
Коли ви говорите , «навіть CLI виклик може бути зроблений з використанням залежностей між пакетами» ви говорите про що - щось на зразок цього ?
Марк Маккелві

закрити, але ні, прочитайте слайди, на які я посилався. Ви можете встановити вузлові модулі, що постачаються з інструментами CLI, наприклад,, gruntабо gulp, або mkdirpтощо, не вимагаючи, щоб люди встановлювали їх глобально, а потім викликали їх так, ніби вони глобально встановлені у сценарії npm, наприклад "build": "mkdirp build && less style/index.less > static/css/style.css && webpack". Поки командами, які ви викликаєте, керує npm (тобто у списках залежностей package.json), це просто працює. Для будь-якої команди "це працює лише для однієї ОС" використовуйте модуль вузла, який універсально робить те саме.
Майк 'Помакс' Камерманс

10
Наведені вище коментарі говорять „ні”, з поважних причин, портативності. Але це залежить від вашої аудиторії. Якщо це внутрішній проект, якщо ваші розробники працюють на UNIX-подібних варіантах (Linux / Macs тощо), це чудово. Якщо ви створюєте бібліотеку загального призначення, це, мабуть, не ... Користування BASH / SH має певні переваги, ви зможете досягти деяких речей в один рядок, для яких знадобляться сторінки Grunt / Gulp, але тоді, ви напевно виключають користувачів Windows, що може представляти проблему або не бути проблемою.
Форбсмієстер,

2
Чому rimraf кращий за rm -rf для веб-програми? rimraf повинен робити речі по одному файлу за раз, і просто більше пакетів вам не потрібно. Якщо веб-сервер не має bash, ви можете використовувати del, але він, швидше за все, має bash, якщо користувач все одно розробляє node, а не .net або щось інше. Навіть якщо це .net, він все одно, мабуть, має якусь форму gitbash чи щось інше.
Кріс Вуд,

Відповіді:


127

Це цілком можливо ...

"scripts": {
   "build": "./build.sh"
},

також переконайтеся, що ви розмістили хеш-удар у верхній частині вашого файлу bash #!/usr/bin/env bash

також переконайтеся, що у вас є дозволи на виконання файлу

chmod +x ./build.sh

Нарешті, команда для запуску build in npm буде

npm run build

2
ви можете помістити його куди завгодно, просто переконайтеся, що ви вклали відносний шлях у package.json, наприклад"build": ". ./path/to/my/awesome/build/file/build.sh"
eblahm

1
він запускає скрипт у поточній оболонці superuser.com/questions/46139/what-does-source-do
eblahm

9
А як щодо вікон?
Lajos Meszaros

9
На Windows gitbash: '.' is not recognized as an internal or external command, operable program or batch file.див. Тут, щоб дізнатися, чому. Крім того, налаштування sh-файлів, які слід відкривати за допомогою gitbash за замовчуванням, або будь-яке інше середовище, яке може запускати скрипти bash, змусить це працювати.
cjsimon

13
У Windows bash для мене працював наступний сценарій npm:"name": "bash ./name.sh"
Рашомон

3

Ще простіше:

Я регулярно роблю це для одноразових випадків, а PoC не залучає VCS

package.json
{
    "scripts": {
        "ship": "rsync -avz deployable/* <some-server>:/var/www/some-site/sub-dir/"
    },
}
...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.