Канал Nuances of programming представил перевод статьи Брайана Форда: «Participating in Open Source»
Я написал это руководство, чтобы помочь любому присоединяться или выкладывать свои (contributing) open source проекты на GitHub. Одна из причин крутости open source — в желании людей помогать друг другу.
Не важно — программируете ли вы много лет или только начали, есть несколько моментов, которые вам нужно знать, чтобы продуктивно использовать GitHub. Гайдов «как» сделать что-то с технической точки зрения на GitHub множество: на какую кнопку нажать, какие команды запустить и подобное.
В начале публикация своей работы на GitHub пугает. Существует мало руководств, посвященных этикету, практическим приёмам и ожиданиям. Этот гайд направлен заполнить пробелы.
Читая этот гайд, помните, что нормально (и даже ожидаемо!) делать ошибки. Не нужно запоминать каждую мелочь. Делайте всё возможное и учитесь в процессе.
Гайд предполагает, что вы работаете с JavaScript-модулем, установленным через npm
или bower
, который размещён на GitHub. Кроме команд, предназначенных для npm
или bower
, большая часть этого гайда применима к другим платформам и языкам.
Как задавать вопрос
Перед тем, как спрашивать, поищите и почитайте существующие записи. Загляните в документы, Google, GitHub, и StackOverflow. Если на ваш вопрос уже отвечали раньше много раз, то разработчики, ответственные за проект, возможно, устали повторять ответ.
Если проект маленький, обычно принято задавать вопросы через отправку issue (см. ниже). Если большой — у них скорее всего есть рассылка или IRC-канал, через которые лучше всего обращаться с вопросами. StackOverflow — также очень хороший ресурс. Когда есть возможность, задавайте вопросы на публичном форуме. Таким образом ответить на вопрос сможет кто угодно, а ответ будет доступен любому человеку с таким же вопросом. Если ничего не работает, можно написать в твиттер или на почту поддержки проекта.
Отправка уведомления о баге (issue)
На GitHub уведомления о багах или улучшениях называются «issues».
Об этом спрашивали раньше?
Перед тем как отправить уведомление, нужно поискать существующие issues. Не забывайте проверять и открытые issues и закрытые. Если вы найдёте issue, который подобен вашему, прочтите всё о нём.
Если issue такой же как у вас, вы можете прокомментировать с дополнениями, чтобы помочь ответственным за проект разработчикам (maintainers) сделать отладку. Добавление комментария автоматически подпишет вас на уведомления по почте, что может быть полезным, когда будут появляться обновления, касающиеся этого issue. Если вам нечего добавить, но вы хотите получать уведомления об обновлениях на почту, вы можете нажать кнопку «watch», которая находится под комментариями.
Нет, никто не спрашивал
Если вы не можете ничего найти в существующих issues, не стесняйтесь отправить свой.
Нужно проверить, что указана версия проекта, так же как и версии связанных с ним приложений. Например, удостоверьтесь, что включили номера версий, выводимые командами node --version
и npm list
. Если вы заметите, что у вас установлена не последняя версия, используйте npm update
и подтвердите, что issue всё ещё присутствует.
Разработчики проекта очень приветствуют тщательные разъяснения. Обычно это помогает им быстрее справиться с проблемой и всем это на руку.
Улучшаем код
Лучший способ — сделать «Fork» (копию) репозитория на GitHub. Это создаст экземпляр-клон репозитория в вашем GitHub аккаунте.
Перед тем как улучшать код, стоит сфокусироваться на том, что вы хотите конкретно сделать.
Каждый коммит должен выполнять что-то одно, а на каждый PR (см. ниже) должно быть одно специфическое улучшение.
Forking
- Нажмите на Fork в репозитории
- Перейдите в ваш форк внутри вашего аккаунта
- Сделайте
git clone
Исправление и тестирование
Ок, теперь вы готовы к исправлению кода? Не совсем! Перед тем, как начать редактировать, вам нужно создать ветку (branch). Branch — как альтернативная временная линия.
Делаем ветку: git checkout -b something
Если вы пытаетесь починить баг, возможно вам стоит назвать ветку «fix-short-description». Если вы добавляете функциональность, «feat-short-description» — хорошее название. Когда вы меняете что-то в коде, возможно, вам захочется испытать его внутри какого-нибудь приложения или более крупного проекта.
В отношении стиля кода — просто пытайтесь имитировать стиль существующего. Не пыхтите над ним слишком сильно. Если владельцам не понравится внешний вид вашего кода, они предложат изменения.
Большая часть проектов пользуется наборами тестов, для уверенности в том, что имеющаяся функциональность кода не меняется из-за вносимых изменений. Это помогает поддерживать софт в стабильном состоянии.
Коммиты и пуш
git commit -m "your commit message"
Использование собственных изменений
Хоть это и не очевидно, вы можете начать использовать код в своих проектах сразу же.
Отправка ваших изменений обратно в проект
Вы сделали изменения, протестировали их с git commit
и хотите отправить обратно в проект, чтобы они были включены в следующие версии.
На GitHub это делается с помощью отправки «pull request» (PR).
Отправка pull request
Золотое правило отправки pull request — всё выполнять так, как задумали владельцы проекта. Вы не можете читать мысли ответственных за проект, но можете посмотреть, что они делали в прошлом. Оценка этих действий заранее может повысить вероятность принятия ваших изменений.
Проще выражаясь: попытайтесь сымитировать стиль существующего кода. Обращайте внимание на отступы и стиль фигурных скобок в коде. Содержит стиль ранние инструкции return
или там их избегают?
Код — не единственное, на что стоит обращать внимание. Заметьте какое время и формат имеют коммиты сообщений. Некоторые проекты используют настоящее время: «fixes the bug». А некоторые прошедшее: «fixed the bug».
Хороший способ проверить это — использовать git log
и прочитать последние коммиты.
Что ещё стоит помнить:
Не меняйте номер версии софта (в package.json
или bower.json
). Владельцы проекта сами позаботятся об этом, когда будут выпускать новую версию.
Если проект поддерживается корпорацией, возможно у них есть Contributor License Agreement (CLA) для избежания проблем с законом.
Владельцы проекта могут быть заняты, так что дайте им немного времени. Разработчики, вовлечённые в open source, часто участвуют во множестве проектов. Нередко разработчик получает десятки нотификаций о неисправностях в день, так что будьте терпеливым.
Если они не отвечают в течение 2 недель, вы можете прокомментировать это, чтобы вынести тему наверх. Чего-нибудь, вроде, «ping @ProjectMaintainer» обычно достаточно. Если даже после этого от них ничего не слышно, электронная почта — хороший способ выйти на контакт.
Команда может ответить тремя возможными способами:
- Всё сливается (merge). Ура!
- Ответственный за проект просит вас исправить что-то в PR перед тем, как принять вас. Мы обсудим это ниже.
- PR закрывается, а ваши изменения не добавлены. Обычно ответственные за проект дают небольшое разъяснение. Если от вас была новая фича, возможно, уже существует способ заставить код делать то, что вы хотите, вы просто этого не заметили. Если исправление бага, возможно, они хотят решить проблему иначе. Не позволяйте трудностям отбить у вас желание продолжать.
Исправление issues в pull request
Когда команда просит внести изменения в PR, новички ошибочно закрывают существующий и создают новый. Не стоит так делать! Существующий PR легко обновляется.
Во-первых, внесите изменения в соответствующие файлы. Добавьте файл с помощью git add
, как вы уже делали:
git add some-file
Затем можете изменить свой предыдущий коммит вот так:
git commit --amend
Эта команда помещает ваши поэтапные изменения в предыдущий коммит.
Чтобы обновить коммит в вашем PR, вам нужно выполнить force push:
git push --force
Команда --force
сообщает git
, что вы хотите перезаписать предыдущий коммит.
Другая распространенная ошибка — создание нескольких коммитов, вместо внесения изменений в один.
Почитайте о перезаписи истории.
Мой PR был закрыт, но я хочу использовать свои изменения!
Хорошие новости: даже если ваше изменение не будет принято в репозиторий контрибьютора, вы в любом случае сможете его использовать. npm позволяет установить из репозитория GitHub
$ npm install user/repo
А ещё вы можете использовать свои изменения и одновременно видеть изменения исходного кода репозитория. Обычно это называется «maintaining a fork» (поддержка копии) проекта. Для этого потребуется добавить ещё один remote.
Создание своего проекта
Перед тем как начинать свой проект, пожалуйста хорошо изучите существующие — нет ли сильно похожего на ваш.
Поиск по существующим проектам
$ npm search
Иногда вы находите старый проект, который больше не поддерживается, но он решает ваши проблемы. Как делать форк смотрите выше.
Бонус: Составляйте список заметок по ходу работы. Если найдете понравившийся модуль, можете использовать заметки, чтобы улучшить секцию «See Also» в тех модулях, которые вам встретились, пока вы вели поиск, отправив им PR. Если не найдёте нужный модуль и не создадите свой собственный, можете превратить эти заметки в секцию «See Also» для своего модуля!
Начало проекта
Начало нового open source проекта должно быть крайней мерой. Почему?
Практический опыт: Не публикуйте ничего в npm
пока у проекта не будет обоснованной минимальной функциональности.
Помните: вы всегда можете использовать npm link
или npm install user/repo
Название проекта
Если ваш модуль — это плагин, обычно лучший способ — сделать для него префикс, в зависимости от того для чего этот плагин. В некоторых проектах есть гайды или соглашения как это делать. Например компоненты AngularJS обычно называются «angular-something», плагины Gulp —»gulp-something», а плагины Karma — «karma-something».
Пишем Readme
Хороший readme должен состоять из следующих частей:
- Объяснение, которое умещается в одно предложение.
- Установка (Install)
- Смотрите так же (See Also)
Это правда важно. Если существуют другие модули с аналогичной функциональностью, ваш модуль должен объяснять, чем он отличается от других. Эта секция должна быть связана с другими модулями. Это поможет другим решить когда использовать ваш.
Пишем тесты
Есть много способов писать тесты. Их важность в том, что если они провалятся, процесс будет существовать с кодом ошибки. Вы можете использовать для этого assert
или if (condition) { process.exit(1) }
.
Бонус: вы используете инструмент CI вроде TravisCI.
Публикация в npm
Перед публикацией:
- Вы написали
README.md
, который объясняет что делает модуль. Он должен включать секциюSee Also
, которая ведёт на другие подобные пакеты. - Вы написали тесты. Тесты должны запускаться с помощью
npm test
, и они должны проходить.
Бонус: Найдите кого-нибудь, кто будет содействовать в поддержке проекта. Отлично, если кто-то может помочь делать ревью issues и мёрджить PR. Невозможно угадать, как много свободного времени у вас будет в будущем. Обидно иметь непочиненные баги или несмёрженные PR в полезном проекте.
Этикет
Обычно люди покидают сообщества, которые кажутся им недоброжелательными. Чтобы быть уверенным, что все ощущают гостеприимство, важно относиться ко всем мягко и с уважением.
Чаще всего — это не проблема. Но иногда у разработчиков случаются срывы, эмоции зашкаливают, они оскорбляются.
Дальше я выделил несколько тенденций, которые наблюдал сам и способы смягчить подобные ситуации.
Предполагать, что все делают всё возможное
эта задача должна быть очевидной для решения! почему её никто не решил?
Возможно у владельца проекта есть другие важные дела в жизни, которыми ему нужно заниматься. Ставить в приоритет жизненные задачи — не значит быть лентяем. Здоровье, счастье и благополучие реального человека на другом конце интернета намного более важны, чем любой баг.
Одна из мощных сторон open source как раз в том, что вы всегда можете сделать копию и отладить ошибки сами.
вы очевидно не понимаете, о чём я говорю!
Такой тип комментария особенно отталкивает новичков. Совершать ошибки должно быть абсолютно приемлемым.
Это проблематично ещё и потому, что на окружающих участников тоже распространяется чувство вины. Возможно, вы могли бы объяснить недочёт понятнее.
Абсолютно нормально злиться из-за бессилия. Программирование — это одна из самых сложных деятельностей человека. Но, несмотря на это, нужно не упускать точки зрения других людей. Сообщество намного более ценный компонент, чем код, а быть уважительным важнее, чем быть правым.
Заключение
Спасибо за то, что прочитали. Надеюсь этот гайд поможет вам получить то, чего вы хотели от open source.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]