Бывают определенные действия, которые надо обязательно выполнить до того как код попадет в коммит и репозиторий, чтобы, как минимум, не мучиться потом с rebase каждый раз. Решение, которое я опишу короткое и простое, но оно весьма упрощает жизнь разработчика.
Самое очевидное назначение - это выполнение тестов, но для меня это также и сборка бандла. Поскольку я не использую watch и регулярно забываю запускать команду билда руками, в коммит частенько заезжают неактуальные версии бандлов, а актуальные приходится коммитить следом. Выходит не очень опрятно. Для javascript нам поможет утилита pre-commit. Она использует hook гита, но дает возможность не лезть во все эти внутренности и управлять галактикой не выходя из npm. Кроме того, такая механика не будет забыта при смене репозитория.
Пойдем практическим путем: добавляем библиотеку в проект
npm i pre-commit --save-dev
В package.json в секцию pre-commit добавляем комманду build
"pre-commit": [
"build"
],
Однако, собранные файлы бандла не попадут в коммит, т.к. гиту надо явно указывать измененные и добавленные файлы и добавлять все подряд выглядит довольно опасным. Чтобы все начало правильно работать определим команду add-bundles добавляющую файлы бандла.
"scripts": {
"build": "npx rollup --config rollup.config.js",
"add-bundles": "git add dist/*",
"test": "echo \"Error: no test specified\" && exit 1"
},
И саму команду добавляем в секцию pre-commit
"pre-commit": [
"build", "add-bundles"
],
Теперь прямо перед коммитом сразу собирается бандл и добавляется в коммит. Если нужен полный работающий пример, он есть в репозитории этой библиотечки.
У данного пакета есть аналоги и для других хуков, например, этот.
dopusteam
А зачем вы собранный бандл в гит вообще кладёте?
syncro Автор
чтобы его могли использовать со статическим подключением (код написан на еsnext с модулями) и в том числе в не самых новых браузерах, обычная практика для библиотек
andreymal
Это всё конечно хорошо и правильно, но при чём тут гит? Зачем класть бандл в гит?
syncro Автор
чтобы его не надо было собирать тем, кому это не надо
andreymal
Для этого есть npm, CDN и вкладка Releases на гитхабе, а артефакты сборки обычно наоборот прописывают в .gitignore
syncro Автор
это иденпотентный бандл, бывает жизнь без нпм и я не хочу делать людям квесты
andreymal
Вы создаёте людям квест по выковыриванию бандла из гита, нехорошо
syncro Автор
когда я вижу библиотеку которую мне надо подключить статически, я первым делом ищу dist/, если его нет я буду пытаться ее собрать или искать другую. Про то что оно может оказаться в npm или cdn мне бы в голову не пришло наверное
andreymal
Ну вот за явно нетрадиционный подход вы и собираете минусы)
syncro Автор
это как раз традиционный подход, ну что поделать, хабр есть хабр он все свои минусы давно собрал
Wyrd
Для этого есть README.md где обычно написано как пользоваться библиотекой. А если не написано, то это повод усомниться в качестве библиотеки.
syncro Автор
вы предлагаете в ридми описывать раздербанивание нпм пакета или поиск на сидиэн? а не надо ли мне потом еще будет проверку ссылки на целостность в пре-коммит добавлять?
Wyrd
Ну… так делают:
https://github.com/lodash/lodash#download
https://github.com/facebook/react#installation
https://github.com/jashkenas/underscore
https://github.com/zloirock/core-js#installation
syncro Автор
чтобы что-то делать определенным образом надо понимать почему оно так делается, а не безмозгло копировать подходы у других. В компилируемых языках бинарники действительно не коммитят в репозиторий, потому что они получаются разные для каждой машины и при каждой пересборке возникает неоправданно не закоммиченные файлы. Тут всего этого нет и несколько другая история. Задача этого бандла упростить подключение библиотеки для различных случаев, а не усложнить.
Carduelis
В современном мире, даже минифицированные js-файлы для крупных проектов будут отличаться по своему содержанию. Наличием полифиллов или альтернативных решений.
А еще можно поддерживать React Native, скажем. Там свои нюансы и возможности.
Так что, своим комментарием сами же себя и опровергли
syncro Автор
поэтому я не минифицирую этот бандл и не включаю в него полифилы. Есть например люди которые делают еще cjs сборку считая, что это им поможет поддерживать большее число архитектур и они точно также складывают их в build/ и dist/. И если вы загляните в node_modules там вероятно большее число пакетов будет иметь такие сборки.
mayorovp
А зря. Первое место, где её следует искать — это вкладка Releases.
syncro Автор
я думал на битбакете вообще хоститься сначала
mayorovp
А там что, нет релизов? :-(
syncro Автор
есть какой-то Download, зачем мне все эти сложности и привязка к сервису? мне право неудобно еще туда руками каждые 10 килобайт заливать. А потребителю зачем?
syncro Автор
и я делаю ее не только для самых успешных и честолюбивых профессионалов хабра, а для любого уровня и привычек разработчика, если вы считаете что в гите чему-то не место это ради бога, но я вижу огромное количество библиотек с готовыми бандлами в репозиториях
mayorovp
Для тех, кто живёт без npm, существует https://unpkg.com/
syncro Автор
бывают интранеты без доступа к такому
xMushroom
а как они на гитхаб попадут тогда?
syncro Автор
тут могут быть разные способы и регламенты
dravor
Можно пользуясь случаем срошу? Зачем они вообще должны туда попадать?
Свой сервер для описанных выше задач должен устроить полностью. И поднять его — задача ну максимум на пол часа. Что даст гитхаб кроме пиара?
xMushroom
Но зачем, когда отправить на гитхаб — 5 секунд?
А дальше начинаются соображения всякого дальнего порядка, которые во основном сводятся к тому, что городить свой велосипед — плохо (пока очень четко не понимаешь, зачем тебе этот велосипед нужен), а пользоваться общепринятыми в индустрии инструментами — хорошо.
dravor
Ну да. Только это инструмент, над которым нет контроля совершенно. Как вторая точка хранения — вполне, но хоть сколько-то важный проект почему бы не держать на своем оборудовании?
Если уж говорить про 5 сек, то та же GITEA устанавливается почти то же время.
syncro Автор
кроме того, сторонний сервис вас может забанить или замедлить и вообще их использование хорошо только для хттп1 а с мультиплексированием хттп2+ скорее пагубно. unpkg это в самый раз для демок на кодепен, но как единственно возможный вариант не годится. Для обеспечения совместимости с разными модульными форматами включение нескольких точек входа это обычная и даже рекомендуемая часто практика.
Wyrd
В npm пакет класть бандл — согласен. А в гит зачем?
Ну и ещё «вопросы»:
syncro Автор
этож статья про хук коммита, а не бандлы;)
syncro Автор
ну а для нестабильного кода это все нетрудно закомментить
syncro Автор
вспомнил ещё одну причину: я часто ставлю версию прямо из мастера (git+https://, git+ssh://) для проверки гипотез и тестирования до публикации. так гораздо проще добавлять и проверять измения и вариант с бандлами только в пакете мне не подходит никак.