Совместное использование одного и того же файла между разными проектами

Для контроля версий в настоящее время мы используем Visual Source Safe и подумываем о переходе на другую систему контроля версий (SVN, Mercurial, Git).

В настоящее время мы довольно активно используем функцию «Общие» файлы Visual Source Safe. Это позволяет нам совместно использовать код между дизайном и средами выполнения одного продукта, а также между несколькими продуктами.

Например:

**Product One**
  - Design
     Login.cpp
     Login.h
     Helper.cpp
     Helper.h
  - Runtime
     Login.cpp
     Login.h
     Helper.cpp
     Helper.h

**Product Two**
  - Design
     Login.cpp
     Login.h
  - Launcher
     Login.cpp
     Login.h
  - Runtime
     Login.cpp
     Login.h

В этом примере Login.cpp и Login.h содержат общий код, который нужен всем нашим проектам, Helper.cpp и Helper.h используются только в первом продукте. В Visual Source Safe они совместно используются конкретными проектами, что означает, что всякий раз, когда файлы обновляются в одном проекте, они обновляются в любом проекте, с которым они совместно используются.

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

После изучения альтернатив Visual Source Safe выяснилось, что в большинстве систем контроля версий нет идеи общих файлов, вместо этого они используют идею подрепозиториев. ( https://www.mercurial-scm.org/wiki/subrepos http://svnbook.red-bean.com/en/1.0/ch07s03.html< /а>)

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

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

    Первый продукт

    • Design Login.cpp Login.h
    • Во время выполнения Login.cpp Login.h
    • Общий Helper.cpp Helper.h

Это все еще оставляет, что делать с Login.cpp и Logon.h

  1. Должны ли общие файлы быть перемещены в их собственный репозиторий, а затем скомпилированы в lib или dll? Это сделало бы исправление ошибок более трудоемким, поскольку проекты библиотеки пришлось бы редактировать, а затем пересобирать.

  2. Должны ли мы использовать внешние или подрепозитории?

  3. Должны ли мы объединить наши проекты (т. е. среду выполнения, дизайн и программу запуска) в один большой проект?

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

Или, может быть, мы единственные, кто этим занимается...?

Кроме того, мы используем Visual Studio для всех наших вещей.

Спасибо.


person selsine    schedule 26.05.2010    source источник
comment
Добро пожаловать в Microsoft Lock-in (намерены они этого или нет). То, что у вас есть общие библиотеки, которые не собираются отдельно, можно рассматривать как концептуальную ошибку SourceSafe. Я уверен, что вы не единственный, кого соблазнил инструмент, похожий на костыль.   -  person msw    schedule 26.05.2010
comment
@msw Не приведет ли создание отдельных библиотек к созданию нескольких двоичных файлов?   -  person Ian Boyd    schedule 04.07.2014


Ответы (3)


Я могу говорить только с точки зрения SVN, но довольно часто файлы, используемые в нескольких проектах, хранятся в отдельном модуле (в SVN есть концепция модулей, я думаю, это то, что вы имеете в виду, когда имеете в виду подрепозитории).

Я бы сделал это таким образом, чтобы общий код, необходимый для более чем одного проекта, регистрировался как отдельный модуль. Если вы назовете этот модуль Design, а ваши два других продукта зарегистрированы в SVN как ProductOne и ProductTwo, то все, что вам нужно, это извлечь модули Design и ProductOne, сделать ProductOne зависимым от Design для компиляции.

В Visual Studio рабочая область называется решением, которое может содержать более одного проекта. Таким образом, вы можете иметь все три модуля в качестве проектов и сделать проект ProductOne зависимым от проекта Design. Это так просто.

person omermuhammed    schedule 26.05.2010
comment
Привет omermuhammed, Когда вы используете термин модуль SVN, что вы имеете в виду? Я немного погуглил и не смог найти такую ​​функцию в SVN. Вы имеете в виду внешние SVN? svn.haxx.se/users/archive-2006-09/0224. html - person selsine; 27.05.2010
comment
Модуль в SVN — это просто каталог-контейнер для логического набора функций, обычно продукта или библиотеки. Если вы новичок в SVN, просто подумайте о модуле как о папке-контейнере продукта. Другой способ представить это как репозиторий - это место, где компания хранит ВЕСЬ свой код, логически организованный как ряд продуктов, каждый из которых находится в отдельных каталогах (модулях) в репозитории SVN. - person omermuhammed; 27.05.2010

В прошлом я перешел с аналогичной ситуации (С++, Visual Studio, VSS) на svn. Мы решили поделиться исходным кодом между разными проектами с помощью svn:externals. Получилось, но не очень красиво. Особенно с ветками и тегами это может стать очень болезненным.

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

person jeroenh    schedule 26.05.2010

голосовать за Меркуриал!

С учетом этого я бы согласился с другими авторами в том, что вы должны перетаскивать любые файлы, которые вы дублируете, в общее место. Если вы используете Mercurial, у меня будет lib или общий каталог, который является репозиторием mercurial, а затем отдельная папка/репозиторий для каждого проекта и его уникальный код.

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

Надеюсь, это поможет!

person dimo414    schedule 27.05.2010