Я собираюсь открыть исходный код C ++ проекта на Sourceforge.Могу ли я получить несколько советов по организации кода? - PullRequest
10 голосов
/ 26 июля 2010

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

Мои проекты являются кроссплатформенным приложением C ++ и состоят из следующего:

  • Часть библиотеки, которая выполняет реальную работу
  • Отдельная часть графического интерфейса, которая использует библиотечную часть
  • Библиотеки с открытым исходным кодом, пути включения которых необходимы для компиляции библиотеки
  • Модифицированные библиотеки с открытым исходным кодом, которые были изменены, и, следовательно, в некотором смысле также являются прямой частью этого проекта
  • Скомпилированный вывод всех библиотек

Какой лучший способ организовать это?

Работая над этим сам, из корня проекта у меня это так:
/ LibPortion
/ GuiPortion * * тысяча двадцать-одна / libs / библиотеки с открытым исходным кодом
/ libs / модифицированные библиотеки с открытым исходным кодом
/ libs / compiled / для хранения скомпилированных библиотек, в том числе при компиляции для Windows тех, которые не из библиотек с открытым исходным кодом, таких как файлы библиотеки Cygwin

Это разумный способ организовать вещи? Это соответствует соглашениям и ожиданиям?

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

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

Тем не менее, людям, которые не хотят создавать и / или загружать все библиотеки, очень удобно предлагать библиотеки, предварительно скомпилированные для основных платформ. Какой самый умный способ поделиться ими? Я смотрю на Sourceforge, и мне не совсем понятно, как я должен делиться ими, если не как часть моего git-репозитория.

Ответы [ 4 ]

5 голосов
/ 27 июля 2010

/
|- bin - Compiled binaries go here (not submitted to source-control)
|- build - buildscripts, tools used to build your code.
|- lib - Compiled libraries go here (not submitted to source-control)
|- local - (not submitted to source control)
   |- obj - Compiled object-files (not submitted to source-control)
   |- msvc - Autogenerated solution files for visual studio (not submitted to source control) (if applicable)
   |- scripts - Autogenerated script files (if applicable)
|- units
   |- libportion
      |- include - external headers for other units to see
      |- src
   |- guiportion
      |- include
      |- src
|- external
   |- externallib1
      |- include
      |- src

build - simplified build-script calling the correct convention to your buildscripts.
README - text-file explaining your software and the layout of your source.

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

Редактирование: добавлен "локальный" каталог.

3 голосов
/ 27 июля 2010

В общем, отделите свою работу от работы третьих лиц. На самом базовом уровне ваша корневая папка может выглядеть так:

|- GUI
|- Library
|- Third-party
    |- lib
    |- source

Я разделил «стороннюю» папку на две подпапки для обеспечения соответствия лицензии и простоты использования. Как именно вы будете распространять сторонние библиотеки, будет полностью зависеть от их лицензий. Настройте ваши make-файлы так, чтобы скомпилированные библиотеки попадали в папку third-party\lib (в которую вы также будете помещать любые предварительно скомпилированные библиотеки). Таким образом, пользователь может загрузить предварительно скомпилированные библиотеки и проигнорировать папку source или загрузить исходный код и игнорировать папку lib в зависимости от того, хотят ли они пересобрать сторонние библиотеки.

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

Если вы используете немодифицированную библиотеку и используете хранилище Subversion (или подобное), вы можете использовать свойство externals , чтобы связать ваш хранилище со сторонним хранилищем библиотеки, чтобы при получении пользователем копия вашего исходного кода, она берет исходный код библиотеки из собственного репозитория. Таким образом, вам не нужно хранить локальное зеркало исходного кода библиотеки. В зависимости от того, что сторонняя библиотека имеет в своем репо, вы можете использовать внешние ссылки для ссылки на предварительно скомпилированную версию сторонней библиотеки. Это не только уменьшит объем кода, который вам придется разместить в своем репо, но и более четко покажет, что конкретная сторонняя библиотека не была изменена.

При использовании неизмененных библиотек было бы даже лучше вообще не включать исходный код или двоичный файл в дерево исходных текстов. Просто отметьте в своей документации, что ваш проект зависит от библиотеки X (укажите также и версию, если это важно) и предоставьте ссылку на домашнюю страницу проекта / страницу / репозиторий Sourceforge. Позвольте разработчику решить, хотят ли они скомпилировать библиотеку, загрузить предварительно скомпилированную версию или, возможно, использовать версию, которую они уже установили. Это означает, что вы также не можете предполагать, что библиотека или ее заголовки будут существовать в определенном каталоге относительно вашего исходного кода; вместо этого вам придется доверить пользователю установку библиотек, в которых компилятор сможет их найти. Ваш код будет просто предполагать, что они находятся в пути поиска компилятора.

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

Как правило, я бы не рекомендовал распространять предварительно скомпилированные версии вашей библиотеки внутри вашего исходного репозитория. С помощью Sourceforge вы можете предварительно скомпилировать свою библиотеку (или любой другой «конечный продукт») для основных платформ и предлагать их для загрузки.

3 голосов
/ 26 июля 2010

На вашем месте я бы сначала разделил проект между вашим собственным кодом и сторонними библиотеками. Может работать следующее дерево:

/
|- GUI
|- lib
|- third parties
    |- compiled targets
    |- "your first library"
    |- "another library"
    |- ...

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

0 голосов
/ 05 октября 2012

ИМХО, глядя на организацию различных проектов с открытым исходным кодом, может помочь.

Страница проекта vlc может быть хорошей ссылкой

...