Перед коммитом

Бывают определенные действия, которые надо обязательно выполнить до того как код попадет в коммит и репозиторий, чтобы, как минимум, не мучиться потом с 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"
],

Теперь прямо перед коммитом сразу собирается бандл и добавляется в коммит. Если нужен полный работающий пример, он есть в репозитории этой библиотечки.

У данного пакета есть аналоги и для других хуков, например, этот.

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 68

    +16

    А зачем вы собранный бандл в гит вообще кладёте?

      –8
      чтобы его могли использовать со статическим подключением (код написан на еsnext с модулями) и в том числе в не самых новых браузерах, обычная практика для библиотек
        +14

        Это всё конечно хорошо и правильно, но при чём тут гит? Зачем класть бандл в гит?

          –5

          чтобы его не надо было собирать тем, кому это не надо

            +14

            Для этого есть npm, CDN и вкладка Releases на гитхабе, а артефакты сборки обычно наоборот прописывают в .gitignore

              –8

              это иденпотентный бандл, бывает жизнь без нпм и я не хочу делать людям квесты

                +5

                Вы создаёте людям квест по выковыриванию бандла из гита, нехорошо

                  –4
                  когда я вижу библиотеку которую мне надо подключить статически, я первым делом ищу dist/, если его нет я буду пытаться ее собрать или искать другую. Про то что оно может оказаться в npm или cdn мне бы в голову не пришло наверное
                    +1

                    Ну вот за явно нетрадиционный подход вы и собираете минусы)

                      –7
                      это как раз традиционный подход, ну что поделать, хабр есть хабр он все свои минусы давно собрал
                      +2

                      Для этого есть README.md где обычно написано как пользоваться библиотекой. А если не написано, то это повод усомниться в качестве библиотеки.

                        0
                        вы предлагаете в ридми описывать раздербанивание нпм пакета или поиск на сидиэн? а не надо ли мне потом еще будет проверку ссылки на целостность в пре-коммит добавлять?
                            –1
                            чтобы что-то делать определенным образом надо понимать почему оно так делается, а не безмозгло копировать подходы у других. В компилируемых языках бинарники действительно не коммитят в репозиторий, потому что они получаются разные для каждой машины и при каждой пересборке возникает неоправданно не закоммиченные файлы. Тут всего этого нет и несколько другая история. Задача этого бандла упростить подключение библиотеки для различных случаев, а не усложнить.
                              0

                              В современном мире, даже минифицированные js-файлы для крупных проектов будут отличаться по своему содержанию. Наличием полифиллов или альтернативных решений.
                              А еще можно поддерживать React Native, скажем. Там свои нюансы и возможности.


                              Так что, своим комментарием сами же себя и опровергли

                                0
                                В современном мире, даже минифицированные js-файлы для крупных

                                поэтому я не минифицирую этот бандл и не включаю в него полифилы. Есть например люди которые делают еще cjs сборку считая, что это им поможет поддерживать большее число архитектур и они точно также складывают их в build/ и dist/. И если вы загляните в node_modules там вероятно большее число пакетов будет иметь такие сборки.
                        +1

                        А зря. Первое место, где её следует искать — это вкладка Releases.

                          0
                          я думал на битбакете вообще хоститься сначала
                            0

                            А там что, нет релизов? :-(

                              –2
                              есть какой-то Download, зачем мне все эти сложности и привязка к сервису? мне право неудобно еще туда руками каждые 10 килобайт заливать. А потребителю зачем?
                        –1
                        и я делаю ее не только для самых успешных и честолюбивых профессионалов хабра, а для любого уровня и привычек разработчика, если вы считаете что в гите чему-то не место это ради бога, но я вижу огромное количество библиотек с готовыми бандлами в репозиториях
                        0

                        Для тех, кто живёт без npm, существует https://unpkg.com/

                          –4
                          бывают интранеты без доступа к такому
                            +1
                            а как они на гитхаб попадут тогда?
                              0

                              тут могут быть разные способы и регламенты

                                –1
                                а как они на гитхаб попадут тогда?

                                Можно пользуясь случаем срошу? Зачем они вообще должны туда попадать?
                                Свой сервер для описанных выше задач должен устроить полностью. И поднять его — задача ну максимум на пол часа. Что даст гитхаб кроме пиара?
                                  0
                                  Но зачем, когда отправить на гитхаб — 5 секунд?

                                  А дальше начинаются соображения всякого дальнего порядка, которые во основном сводятся к тому, что городить свой велосипед — плохо (пока очень четко не понимаешь, зачем тебе этот велосипед нужен), а пользоваться общепринятыми в индустрии инструментами — хорошо.
                                    0
                                    Ну да. Только это инструмент, над которым нет контроля совершенно. Как вторая точка хранения — вполне, но хоть сколько-то важный проект почему бы не держать на своем оборудовании?
                                    Если уж говорить про 5 сек, то та же GITEA устанавливается почти то же время.
                              0

                              кроме того, сторонний сервис вас может забанить или замедлить и вообще их использование хорошо только для хттп1 а с мультиплексированием хттп2+ скорее пагубно. unpkg это в самый раз для демок на кодепен, но как единственно возможный вариант не годится. Для обеспечения совместимости с разными модульными форматами включение нескольких точек входа это обычная и даже рекомендуемая часто практика.

                      +2

                      В npm пакет класть бандл — согласен. А в гит зачем?


                      Ну и ещё «вопросы»:


                      • собирать дебаг или релиз?
                      • а если я очень хочу закоммитить поломанный код в какую-то временную ветку? (решил что-то сделать по-другому, но не уверен и хочу сохранить текущий прогресс, например)
                      • делать ли full clean перед сборкой? А если бандл собирается с нуля 2 минуты?
                        –4

                        этож статья про хук коммита, а не бандлы;)

                          –4

                          ну а для нестабильного кода это все нетрудно закомментить

                        0

                        вспомнил ещё одну причину: я часто ставлю версию прямо из мастера (git+https://, git+ssh://) для проверки гипотез и тестирования до публикации. так гораздо проще добавлять и проверять измения и вариант с бандлами только в пакете мне не подходит никак.

                        +4

                        Мне эта библиотека кажется странной.
                        Чтобы запустить что-то (не обсуждая, что) перед коммитом, думаю лучше использовать husky, потому что там есть и другие гитовые хуки, которые смогу понадобиться со временем.

                          –3
                          если бы я впервые увидел код package.json и захотел понять почему перед коммитом что-то происходит само по себе, мне была бы понятнее секция pre-commit чем новое слово на букву ху:) кроме того там явно больше движений с этим ручным запуском инсталла. Что касается других хуков, то у пре-коммит есть компаньены: www.npmjs.com/package/post-commit
                            0
                            у husky вы тоже самое можете увидеть в package.json, но это более живой и полный инструмент чем тот, на который ссылаетесь вы
                              +1
                              мне была бы понятнее секция pre-commit чем новое слово на букву ху:)

                              ну я не сцу кипятком от слова CI… но у меня и без этого все работает довольно быстро с этой библиотекой даже на стареньком ноуте.
                              это более чем характеризует вас, как спеца. И где «вы такие» беретесь только )))

                              Вот бы мне на интервью кто то отмочил подобное, но к сожалению такие клоуны профессионалы не попадаются ((
                                –1

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

                                  0
                                  договаривайте, что бы было если бы «отмочил», а то я не понял намёка
                            +2

                            А почему бы для этого не использовать CI? Чтобы сэкономить своё время/головную боль с хуками, и это проще масштабируется на несколько разработчиков
                            (вот мой недавний пример: https://github.com/materializecss/materialize, тут dist на много коммитов отстал от кода)


                            Сейчас существует достаточно cloud CI, вам даже ничего поднимать не нужно, только настроить аккаунт один раз


                            когда я вижу библиотеку которую мне надо подключить статически, я первым делом ищу dist/, если его нет я буду пытаться ее собрать или искать другую

                            Я честно говоря не знаю, как "принято" в нпм мире, но мне кажется более логичным использовать для этого как минимум GitHub releases (или нечто подобное). Хотя логичнее всего выглядит npmjs или какие другие репозитории
                            И, в моём скромном опыте, для подключения npm библиотеки из гитхаба, дист не нужен, нпм может подхватывать по прямой гитхаб ссылке

                              –1
                              зачем с CI или там CDN если можно без него? 8 килобайт бандла не стоят этих всех движений.

                              И, в моём скромном опыте, для подключения npm библиотеки из гитхаба


                              можно подключать ее как esm модуль, можно статически, я сделал оба варианта чтобы она подходила для всех случаев. Например на какой-нибудь жуткий вордпрес шаблон или что-то такое.
                                0

                                Полезность CI не зависит от размера бандла.

                                  0
                                  это само собой, но для таких условий это как из пушки по воробьям по-моему, впрочем я может ради плашки посмотрю в эту сторону, но dist/ пожалуй оставлю для совместимости хотя бы с теми кто привык думать и действовать также как я:)
                                    0

                                    Я рад, что вы решили попробовать )
                                    Вот пример, как из трависа сделать коммит в гитхаб обратно:
                                    https://gist.github.com/willprice/e07efd73fb7f13f917ea


                                    Разумеется, на изначальную настройку и изучение Travis (или любого другого CI, который вы решите попробовать) вам понадобится время. Но изучение новой технологии всегда полезно и пригодится в будущем
                                    Но в целом ваш финальный CI файл может выглядеть примерно так:


                                    dist: bionic
                                    language: node_js
                                    node_js:
                                      - '15'
                                    script:
                                      - npx rollup --config rollup.config.js
                                    after_success:
                                      - .travis/push.sh
                                    env:
                                      global:
                                        secure: YOUR_ENCRYPTED_GITHUB_KEY
                                    

                                    Как по мне, это не "из пушки по воробьям", а вполне себе лаконично

                                      0
                                      а если я решу хостить этот код на своем гитлабе?
                                        0

                                        …то там есть свой CI

                                          –2
                                          ну я не сцу кипятком от слова CI потому, что вижу их много разных и уже довольно давно, для большого и многокомпонентного проекта и команды безусловно это полезно, но у меня и без этого все работает довольно быстро с этой библиотекой даже на стареньком ноуте. А вдруг у этого трависа в лицензии мелким подчерком написано, что (бесплатное) использование его означает передачу всех прав на собранное микрософту;)? Вот сегодня я поймал от них уведомление, что они скоро отключат пароли. А завтра введут плату за CI или еще что-нибудь сломают.
                                            –1
                                            А уже не важно. Дальше «минусаторы» будут объяснять почему нужно сломать то что работает, объясняя, что оно работает неправильно и все остальные делают по другому.
                                              –3
                                              чета какое-то обострение у них, впрочем они давно порывались мне аккаунт слить несмотря на то, что я уже и в дискуссиях не участвую тут из-за таких вот идиотов, видимо невыносима жизнь красноглазая микрософто-пхпшная, что нельзя пройти мимо или признать, что кто-то другой прав;)
                                                0
                                                Ну грубость никогда уместной не будет в диспутах, так что фильтровать все же стоит.
                                                В остальном, я сторонник того, что номером первым всегда должен идти результат. Если результат есть, тогда можно уже обсуждать недостатки процесса. Если же переделка процесса выльется в отстутствие результата — это уже теоретический спор ради спора, а не что-то нужное в реальной жизни.
                                                  –2
                                                  агрументировать толпой это и есть грубость недостойная уважительного или даже учтивого обращения
                                                +1

                                                Честно говоря, мой посыл был в другом: мне хочется, чтобы начинающие разработчики, прочитав эту статью, прочитали и мой комментарий. И вместо того, чтобы городить свой огород с хуками и локальными решениями, использовали более популярные стандарты. Это облегчает работу другим разработчикам (и даже себе будущему)


                                                Если у автора всё работает, он всё делает с одного компа, и никто его код трогать не будет, то решение себя оправдывает. Конечно, ничего переделывать не нужно.


                                                Но, возможно, задуматься о более подходящих инструментах для новых проектов. Если их использование не сопряжено с чрезмерными трудностями.


                                                ПС "я не сцу кипятком от слова CI" тоже. Для меня CI = автоматизация, и вот она действительно важна. Решение с хуками, как по мне, это недо-автоматизация.


                                                ППС я тоже начинал с ручных поделок и хуков (да и сейчас они есть). Но единственная причина их иметь, как по мне, это лень и чрезмерное количество свободного времени, чтобы тратить его вручную

                                                  –1
                                                  это заметка не про CI, а про хуки, использование которых может может сильно облегчать жизнь разработчикам. В моей постановке примера использования было требование иметь соответствие кода бандла и исходников в рамках одного коммита без зависимости от человеческого фактора. Если бы я использовал CI это было бы снова 2 разных коммита. Я тоже восновном не пользуюсь хуками, т.к. они лежат где-то далеко и не надежно (ну или не прозрачно) по моим ощущениям, но в package.json они меня теперь вполне устраивают.
                                +1
                                не мучиться потом с rebase каждый раз

                                А какие с ним мучения? Интерактивный ребейз, удобный редактор и как бы всё — история ветки получается красивой и логичной, а не 100500 тупых коммитов о метании мысли, забывчивости, мёрдже мастера из оригин мастера и прочего треша.


                                Хотя ваш подход хранения артефактов в гите сомнителен.

                                  –1

                                  с ребейзом тоже надо вовремя вспомнить, что ты не собрал бандл. Артефакты это упакованные бинарники в джаве, а не специальная версия для совместимости.

                                  0
                                  Теперь прямо перед коммитом сразу собирается бандл и добавляется в коммит.
                                  о_О кто то реально использует такое на практике? А что делать, если бандл пару сот мегабайт или пару гигабайт? Чем не устроило хранение бандлов/артефактов в том же Artifactory?
                                    +1

                                    он будет в браузер загружен, если вы туда пару гигабайт готовите, это и в самом деле проблема

                                      0
                                      он будет в браузер загружен
                                      кто он?

                                      В общем, вы выдумали жесточайший велосипед с квадратными колесами, у которого очень узкий и специфический круг применения.
                                        –2

                                        то что вы шестерка и кривляетесь чужими фразами вас никак не оправдывает

                                          +1
                                          Это клиника )))
                                            –1

                                            да хоть хоспис, вы занимайтесь друг дружкой и не лезьте к нормальным людям

                                      –2

                                      и конечно бандл это не всегда артефакт, мой код не надо компилировать, чтобы он заработал. Вам тайпскрипт и SPA совсем мозги зафимозили похоже.

                                        0

                                        Не могу найти в комментарии, на который вы отвечали, слово "компиляция" или однокоренные с ним. Кажется, это вам тайпскрипт и SPA "мозги зафимозили", только в другую сторону — в любом комментарии вы почему-то видите намёк на них...

                                          –1

                                          артефакт подразумевает бинарник, который надо компилировать из исходника и деплоить. У меня ничего такого нет библиотека подключается прямо в браузерной вёрстке как есть из бандла или как модуль в вашем коде где вы можете самостоятельно городить CI и что вам там вздумается

                                            0

                                            Артефакт подразумевает любой результат сборки (а построение бандла — тоже сборка), который надо деплоить (а копирование в директорию веб-сервера — тоже деплой).

                                              –1

                                              это сборка не бинарника, а версии для другой модульной системы

                                                0

                                                И что от этого меняется?

                                                  –4

                                                  ничего, вы так и остаетесь злокозненными долбае-ами

                                    Only users with full accounts can post comments. Log in, please.