Что, если бы вы могли «копировать-вставить» код в несколько проектов и легко синхронизировать изменения исходного кода и зависимостей?
Мы все копируем и вставляем код. Мы знаем, что не должны, но знаем.
Почему? Это не потому, что мы плохие разработчики. Это потому, что иногда мы просто хотим выполнить работу, создав что-то, что работает быстро.
В этом посте я расскажу, как вы можете управлять копированием и синхронизировать изменения в разных репозиториях и всей вашей кодовой базе с помощью Bit.
В результате, когда вы хотите поделиться кодом из одного проекта в другой, вы можете очень быстро использовать Bit, чтобы поделиться им между двумя проектами, сохраняя при этом управление, от изменений исходного кода до зависимостей.
Это означает больше совместного использования кода и меньше накладных расходов. Вы избавитесь от запаха кода и сможете применить лучшую практику, не теряя скорости.
Итак, как это работает?
Вот основная концепция, которая делает все это возможным:
Git управляет изменениями исходного кода в одном репозитории, но не отношениями между кодом в разных репозиториях. Менеджеры пакетов обрабатывают зависимости для опубликованных модулей, но не исходный код.
Bit обрабатывает как исходный код, так и зависимости. Благодаря этому он может практически мгновенно экспортировать код из одного репозитория и импортировать его в другой репозиторий, сохраняя при этом их синхронизацию.
Экспорт кода для совместного использования
Допустим, у меня есть репозиторий с простой многоразовой функцией hello-world:
.
├── package.json
└── src
├── hello-world.js
└── index.js
Используя Bit, мы можем отслеживать этот компонент в репо с помощью одной команды:
$ bit add src/hello-world.js src/index.js --id hello/world
tracking component hello/world: added src/hello-world.js added src/index.js
После отслеживания Bit запускает код и разрешает весь график зависимостей функции. Затем он записывает компонент как единое целое и отслеживает его.
Возможно, нам потребуется добавить конфигурацию компиляции + тестирования для всего проекта, что можно сделать с использованием готовых битовых компонентов. Все довольно просто.
Затем мы можем версировать компонент и экспортировать его в bit.dev (Bit’s hub):
$ bit tag hello/world
1 components tagged | 1 added, 0 changed, 0 auto-tagged
added components: hello/[email protected]
А также
$ bit export user-name.my-collection-name
1 component was exported to Collection user-name.my-collection-name
Вот и все! Теперь к компоненту предоставлен доступ и он готов к использованию в другом проекте. Никакого рефакторинга, никакой сложной настройки. Это быстрее, чем копирование.
Вот реальный пример результата того же рабочего процесса с Ramda utlis:
Импорт общего кода из другого проекта
Итак, теперь у нас есть эта функция как повторно используемый компонент в bit.dev, и мы хотим использовать ее в другом проекте.
Давайте перейдем к другому проекту и используем Bit для импорта компонента:
$ bit import user-name.collection-name/name-space/hello-world
Вот и все. Функция теперь также находится в новом проекте. Круто, правда? Нам не нужно было много работать, чтобы разрешить зависимости и подогнать код под новый проект, Bit сделал это за нас. Мы не изменили ни одной строчки кода в исходном проекте. Этот процесс также поддерживает совместное использование нескольких компонентов.
Но что произойдет, если мы внесем небольшое изменение в компоненты одного из проектов? Давайте посмотрим.
Синхронизация изменений общего кода между проектами
Итак, теперь у нас есть одна и та же функция hello-world, реализованная в обоих проектах.
Давайте внесем небольшие изменения в функцию из второго проекта. Исходный код файла hello-world.js выглядит так:
export default function hello(world) {
return `hello ${world}`;
}
Давайте изменим его так, чтобы он возвращал hi world
, но оставим имя функции:
export default function hello(world) {
return `hi ${world}`;
}
Затем давайте быстро bit status
посмотрим, что изменилось:
$ bit status
modified components
> name-space/hello-world... ok
Теперь давайте создадим версию измененного компонента и экспортируем его обратно в коллекцию:
$ bit tag name-space/hello-world
$ bit export user-name.collection-name
Версия будет изменена, а коллекция будет дополнена измененным компонентом!
Затем вернемся к исходному репозиторию, чтобы синхронизировать изменения.
Выполните быстрый bit import
, чтобы загрузить новую версию, созданную из другого проекта:
$ bit import user-name.collection-name/name-space/hello-world
А затем используйте checkout, чтобы объединить изменения!
$ bit checkout 1.0.1 string/contains
successfully switched hello-world to version 1.0.1
Bit использует git merge
для автоматического объединения обеих версий:
$ bit status modified components (use "bit tag --all [version]" to lock a version with all your changes)
> name-space/hello-world ... ok
Вот и все!
Что сейчас произошло?
Итак, мы создали управляемое копирование и вставку для общего кода между двумя проектами JavaScript!
Всякий раз, когда в одном из них происходит изменение исходного кода, мы можем легко обновить и даже объединить изменения между двумя проектами. Когда другой компонент зависит от этого компонента, мы можем легко обновить все зависимые компоненты новой версией и увидеть, что ничего не сломается.
Результат? больше совместного использования кода, меньше кода, более быстрая разработка. Не стесняйтесь нырнуть и попробовать :)