Статьи

Соглашения о содействии открытому исходному коду

Неделя с открытым исходным кодом

Это неделя с открытым исходным кодом в SitePoint! Всю неделю мы публикуем статьи, посвященные всему, что связано с открытым исходным кодом, свободным программным обеспечением и сообществом, поэтому постоянно проверяйте тег OSW на наличие последних обновлений.

открытый источник

Эта статья была рецензирована Томом Паркином . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

Мы все любим использовать открытый исходный код, верно? Я сделал свою большую часть вклада в открытый исходный код, в основном благодаря небольшим вкладам здесь и там. В прошлом я пытался открыть исходные тексты некоторых библиотек, с разными уровнями успеха и неудач. Я бы сказал, что я где-то посередине на Спектруме Участника. Есть те, которые делают намного больше, и те, которые делают намного меньше.

Если вы заинтересованы в том, чтобы стать участником OSS, у нас нет недостатка в статьях о том, как это сделать. На самом деле, я написал один сам пару лет назад. Я оставлю шаг за шагом, способствуя в умелых руках упомянутых статей.

Сегодня я хочу сосредоточиться на некоторых соглашениях об использовании открытого исходного кода, рассматривая их с точки зрения создателя открытого исходного кода. Мое транспортное средство для этого путешествия — Руководства Вкладов Rails. Rails, как мы все знаем, является очень, очень зрелой структурой и огромным проектом с открытым исходным кодом, состоящим из множества модулей и тысяч участников. При всей этой деятельности, связанной с созданием и обслуживанием Rails, документация и соглашения, используемые для участников, должны быть всеобъемлющими и правильно оформленными.

Другими словами, я чувствую, что Rails — это хорошее исследование, когда речь заходит о том, как программное обеспечение с открытым исходным кодом может создать руководство. Посмотрим, прав ли я.

Гид

Как я уже говорил, мы собираемся пройтись по руководству «Вклад в Ruby on Rails» , вытащить и обсудить подход, который Rails применяет к вкладам. Вот основные пункты в начале руководства:

  • Как использовать GitHub для сообщения о проблемах.
  • Как клонировать мастер и запустить тестовый набор.
  • Как помочь решить существующие проблемы.
  • Как внести свой вклад в документацию по Ruby on Rails.
  • Как внести свой вклад в код Ruby on Rails.

Это то, что авторы руководства считают наиболее важными, высокоуровневыми материалами для участников. Посмотрим, как они справятся с каждым.

Правила поведения

Однако до этого я хотел бы отметить, что в Rails есть официальный Кодекс поведения (CoC) . Согласны ли вы с существованием или необходимостью такого документа, у Rails есть такой. Как таковые, участники должны соблюдать CoC. Это подводит меня к важному соображению, когда вы решите стать участником открытого кода.

Если вы собираетесь открыть исходный код своего собственного творения, вам следует продумать вопросы, поднятые в Rails CoC. CoCs часто являются поляризационной проблемой, поэтому важно, хотите ли вы иметь такую ​​и что она говорит. Как вы будете обрабатывать жалобы? Что вы можете сделать, если чувствуете, что кто-то оскорбляет или не уважает вас как часть вашего вклада? Убедитесь, что вы понимаете ожидания: ваши и ожидания сообщества.

Сообщение об ошибках / проблемах

Rails выбрал Github Issue Tracking для сообщения о новых ошибках и проблемах. Это отличный выбор, так как почти все будут знакомы с Github, и сам код размещен там. Команда Rails различает проблемы безопасности и безопасности.

Проблемы с безопасностью

О проблемах безопасности сообщается на другом сайте , который мне нравится воспринимать как своего рода Batphone для основной команды. Кроме того, существует очень другой протокол для вопросов безопасности.

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

Все другие вопросы

Если проблема не связана с безопасностью, то можно использовать Github Issues. Основная команда, будучи удивительными людьми, создала кучу шаблонов, чтобы помочь репортерам создать исполняемый контрольный пример для данной проблемы. Вот шаблон выпуска Active Record:

begin
  require "bundler/inline"
rescue LoadError => e
  $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
  raise e
end

gemfile(true) do
  source "https://rubygems.org"
  # Activate the gem you are reporting the issue against.
  gem "activerecord", "5.0.0"
  gem "sqlite3"
end

require "active_record"
require "minitest/autorun"
require "logger"

# Ensure backward compatibility with Minitest 4
Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)

# This connection will do for database-independent bug reports.
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Base.logger = Logger.new(STDOUT)

ActiveRecord::Schema.define do
  create_table :posts, force: true do |t|
  end

  create_table :comments, force: true do |t|
    t.integer :post_id
  end
end

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

class BugTest < Minitest::Test
  def test_association_stuff
    post = Post.create!
    post.comments << Comment.create!

    assert_equal 1, post.comments.count
    assert_equal 1, Comment.count
    assert_equal post.id, Comment.first.post.id
  end
end

Это отличная идея и способ действительно помочь кому-то сообщить о проблеме. Это позволяет другим быстро воспроизвести проблему, которая приведет к гораздо более быстрому разрешению.

Запросы функций

Запросы на функции не сообщаются как проблемы для Rails. Вместо этого ожидается, что запросчик напишет код для функции и отправит его как вклад. Это имеет смысл, поэтому запрос новой функции подпадает под руководство по новому вкладу.

Помогая решить существующие проблемы

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

Если кто-то отправил исправление с помощью запроса извлечения (PR), вы можете проверить PR и проверить исправление.

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

Если вы собираетесь предложить элемент с открытым исходным кодом, подумайте о помощи, которую вы можете использовать, помимо нового кода. Могут ли люди тестировать новые функции и сообщать об ошибках? Могу поспорить, что они могут, и это является более низким барьером для входа для многих людей.

Внести вклад в документацию по Rails

В Rails есть целый раздел, посвященный тому, чтобы просто внести свой вклад в документацию фреймворка. Опять же, это то, чему должны научиться новые открытые источники. Как документируется ваша библиотека? Это ясно и легко найти? Кроме того, как другие могут улучшить ваши документы? Убедитесь, что вы ответили на эти важные вопросы.

В большинстве случаев вам не потребуется документация на уровне, предлагаемом Rails. Он массивный и используется десятками тысяч (если не больше) людей по всему миру. Но дело в том, чтобы получить хороший ответ для вашей документации. Я могу сказать вам, что я пытался выпустить библиотеку с очень тонким README в качестве документации, и она не удалась.

Перевод документации

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

Вклад в исходный код

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

Настройка локальной среды

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

Rails предлагает два способа настройки вашей среды: «легкий» и «сложный». Самый простой способ — запустить «окно разработки Rails», которое представляет собой виртуальную машину (ВМ), готовую к работе. Если у вас есть VirtualBox и Vagrant, вы можете запустить их и начать писать код. Это легко.

Итак, есть трудный путь, который означает, что вы в основном устанавливаете все локально. «Все» для разработки Rails состоит из:

  • Гит
  • SQLite (с библиотеками разработчиков)
  • Memcached
  • MySQL
  • PostgreSQL
  • Redis

И многие из них имеют подзадачи настройки. Хлоп! Это трудный путь.

Несмотря на это, смысл в том, что Rails задокументировал, как настроить локальную среду и получить кодирование. Все предложения с открытым исходным кодом должны делать то же самое. В связи с этим, мне интересно, почему нет среды / инструкций для Rails на основе Docker. Хммм … может быть, кто-то может внести один …

Написать код

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

Соглашения об управлении источниками

Во-первых, как изолировать ваш код от основной или основной ветки. Другими словами, как участник должен использовать Git.

Rails делает это довольно просто и просто просит людей создать ветку и работать над этим. Да, и они предлагают классный способ создать фиктивное приложение Rails, которое будет использовать вашу локальную ветку.

Соглашения о кодировании

Rails действительно перечисляет ряд соглашений кода, которые он ожидает от людей, что является хорошей идеей. Есть драгоценные камни, которые могут помочь обеспечить такие вещи, такие как Rubucop . На самом деле, в репозитории Rails GitHub есть файл конфигурации Rubucop ( .rubocop.yml

Тестирование кода

Очевидно, вы захотите, чтобы участники написали и запустили тесты для своего кода. Вы должны иметь четкие инструкции о том, как они могут это сделать. Вероятно, хорошей идеей будет иметь задачи Rake или что-то подобное, которые будут выполнять все ваши задачи.

Как уже упоминалось, Rails состоит из множества модулей. Таким образом, запуск тестов для всей базы кода Rails не требуется. Rails документирует способы запуска тестов на данном модуле, чтобы участники могли просто проверить, что они меняют. Ницца.

Кроме того, Rails использует Travis CI, сервер непрерывной интеграции, для запуска всех тестов. Это система безопасности, которая означает, что не заставлять всех запускать все тесты для каждого вклада — это нормально. Опять же, упростите запуск тестов, иначе никто не будет запускать тесты.

Документирование изменений

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

Управление зависимостями

Ваша библиотека, несомненно, будет зависеть от других драгоценных камней Ruby. Что произойдет, если вкладчику потребуется изменить / обновить его, чтобы заставить его код работать? Вы должны продумать это до конца.

Rails, опять же, делает это легко, потому что Bundler делает это легко. Просто обновите Gemfile.lock и запустите ваши тесты.

Передача изменений

Сообщения хорошего коммита — это как жилет безопасности: иногда их трудно надеть, но, если они вам нужны, они бесценны. Я настоятельно рекомендую вам иметь стандарт для ваших сообщений коммита. Rails делает, что я покажу здесь:

 Short summary (ideally 50 characters or less)

More detailed description, if necessary. It should be wrapped to
72 characters. Try to be as descriptive as you can. Even if you
think that the commit content is obvious, it may not be obvious
to others. Add any description that is already present in the
relevant issues; it should not be necessary to visit a web page
to check the history.

The description section can have multiple paragraphs.

Code examples can be embedded by indenting them with 4 spaces:

    class ArticlesController
      def index
        render json: Article.limit(10)
      end
    end

You can also add bullet points:

- make a bullet point by starting a line with either a dash (-)
  or an asterisk (*)

- wrap lines at 72 characters, and indent any additional lines
  with 2 spaces for readability

Опять же, это не слишком сложно, но оно имеет значение.

Одна вещь, о которой следует знать, — это необходимость обновить ветку функций / ошибок, указав последний источник из репозитория, чтобы избежать конфликтов с работой, выполненной во время их участия. Руководство Rails проходит через это, что является еще одним хорошим примером документирования ваших ожиданий.

О, и еще одна вещь, это хорошая идея, чтобы побудить участников раздавить свои коммиты. Вы не хотите PR с 1023 коммитами, когда только один сделает.

Форкинг и Тяговые Запросы

Документирование того, как вы хотели бы принять код в системе контроля версий, имеет первостепенное значение. Если вы используете Github, существует довольно проторенная дорога к созданию репозитория и выдаче PR. Если ваш репозиторий с открытым исходным кодом небольшой, вы можете выпускать PR из филиалов основного репо. Независимо от вашего выбора, документируйте, что вы хотите.

Обсуждать и повторять

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

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

Обратная Совместимость и Backporting

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

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

Вывод

Rails существует достаточно долго, чтобы создать руководство, которое стоит подражать. Я бы сказал, что главная тема: облегчить людям вклад. Если вы думаете об открытом источнике проекта, вы можете сделать хуже, чем смоделировать свою стратегию вклада в Rails. Обязательно подумайте о:

  • Как участники создают локальную среду?
  • Как люди могут внести свой вклад помимо написания кода?
  • Как управляются мои зависимости?
  • Легко ли запустить тесты?
  • Как я буду обновлять свои документы?

Я надеюсь, что вы нашли эту игру в руководстве по Rails полезным. Я знаю, что сделал. Теперь я собираюсь настроить мою локальную среду Rails … возможно, я буду использовать Docker. Счастливого открытого поиска!