Как Вы разделяете Решение для Visual Studio?

У меня есть решение для Visual Studio 2008 года с> 40 C# и C++ / проекты CLI, которые зависят друг от друга. Работа с тем решением является довольно медленной, и обычно мне только нужны несколько проектов за один раз. Таким образом, я решил разделить решение на несколько решений, которые содержат 3-5 проектов. Я также хотел бы сохранить "полное" решение со всеми проектами (это удобно для для автоматизированных сборок или для больших действий рефакторинга, которые влияют на все проекты). (Это - основное условие здесь. Иначе разделение проектов в решения тривиально, конечно.)

Там какой-либо путь состоит в том, чтобы сделать это?

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

Править:

Спасибо всем за Ваши ответы. Я хотел бы разъяснить свой вопрос немного: Мое решение содержит 44 проекта, не включая тесты. Так разделение его в 2 части не действительно, что я имел в виду, я больше думал приблизительно 5-8 частей. Вот почему я хотел бы сохранить "полное" решение, где VS может выяснить корректный порядок сборки на полную сборку. Поддержание порядка сборки для 8 разных решений вручную (например, в пакетном файле) кажется подверженным ошибкам мне.

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

A is referenced by B is referenced by C is referenced by D

и предположите, что A и D часто изменяются вместе, но B и C редко изменяются. (Очевидно, интерфейс, который используется B, должен остаться неизменным для этого.) Тогда я хотел бы иметь A и D в одном решении, B и C в другом. Но это только работало бы, если у меня могло бы быть неповрежденное "полное" решение, содержащее A, B, C и D, если я хочу разработать все проекты с нуля. Как только та сборка завершена, я мог открыть свой A/D-solution и редактировать/создавать только те 2 проекта.

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

18
задан Niki 12 January 2010 в 18:19
поделиться

5 ответов

Нет хорошего способа сделать это. Инструменты не построены с этим в виду. Вместо этого вы должны объединить ваши проекты вместе как можно больше. Хотя это та же кодекс, сборки будут проходить много раз быстрее.

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

7
ответ дан 30 November 2019 в 07:23
поделиться

Вы можете сделать несколько решений и добавлять любые проекты для каждого решения, которое вам нравится.

Проекты, которые вы хотите построить, могут иметь зависимости от других проектов. В этом случае вам необходимо изменить с использованием ссылки «Проект» (ссылки на WHCH любой другой проект в решении) для использования ссылки на файл (где вы ссылаетесь на сборку .dll, который создал этот проект).

Итак, давайте подумаем о них как «библиотеки» (скомпилированные один раз, а затем использовали многое), а также «основные» проекты (что вы много меняете). Сделайте решения (ы), чтобы содержать ваши проекты «Библиотеки» и (предпочтительно) Добавить шаг после сборки, который копирует результирующие DLL для отладки / выпуска в папки общего библиотеки. Добавьте основные проекты на новое решение. Измените все ссылки на основные решения для ссылки на ваши библиотеки через предварительно созданные двоичные DLL в ваших общих папках (см. Репутацию Build DLL, чтобы ваш окончательный релиз работает правильно).

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

[2018 редактирование] В наши дни библиотеки могут быть распределены с помощью локальных серверов Nuget или NPM, что было бы предпочтительным вариантом, если нет конкретной причины не принять этот подход.

Последний вариант, в случаях библиотек, которые занимают некоторое время для создания и которые изменяются , очень нечасто , состоит в том, чтобы сделать их «предложенные» библиотеки - проверьте окончательные файлы DLL в контроль источника и ваш Участники команды могут просто получить последнюю версию и построить против библиотек без необходимости получать или создавать исходный код для них вообще. (Чтобы обновить эти библиотеки, вы должны не забывать проверить файлы двоичных файлов перед созданием, а затем снова проверять их после восстановления их, поэтому вы должны взвесить преимущества (быстрее и простые повседневные сборки) против недостатков ( немного больше усилий, чтобы внести изменения в библиотеки, большие двоичные файлы в исходном управлении).

7
ответ дан 30 November 2019 в 07:23
поделиться

Вы должны иметь отделение проблем, особенно при группировках проектов в рамках решения Visual Studio. Я недавно столкнулся с этой проблемой на работе, где мне пришлось создать кучу модульных испытаний, и оригинальный тест, созданный разработчиком, был включен в решение. Сначала я думал, что О.К. Я просто поставлю свои тесты здесь B / C Я знаю, что это будет работать и не нужно беспокоиться о том, чтобы получить право зависимости. Но позже после того, как я добавил как 20 тестовых проектов для каждого другого устройства, я понял, что это здание так невероятно медленно.

Я решил создать решение для каждого набора тестов, а не помещать их в одном месте. Это также помогает лучше организовать ваш код, так что легче найти. Например, я создал папку «Тестовый> блок> Интеграция Myunittest» и «Test>»> MyInterationTest. Он не только позволяет легко найти вещи позже, но это поможет вам сделать ваши сборки быстрее. Кроме того, если там есть куча людей, работающих над кодом сразу каждый разработчик, может потенциально изменить настройки проекта и конфигурации и не испортить других.

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

2
ответ дан 30 November 2019 в 07:23
поделиться

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

В верхней части окна является Combobox, где вы можете выбрать конфигурацию отладки или выпуска. Снимите это вниз и выберите опцию «Диспетчер конфигурации ...».

В разделе «Конфигурация активного решения» выпадайте в поле «Комбо» и выберите «Новый ...>». Создайте новую конфигурацию (например, называемую «COREONLY») и выберите «Настройки копирования» как «Отладка». Untick Опция «Создание новых конфигураций проекта».

Теперь ваша настройка сборки «Coreonly» появится в окне. Он показывает список всех проектов. Для любых проектов, которые вы не хотите создавать, сообщить флажок «Создать» в правом столбце. Закройте диалог.

Теперь, чтобы создать все проекты, выберите «Отладка» из раскрывающегося списка конфигурации и постройте как обычно. Когда все ваши проекты построили, вы можете упасть только на создание только «основных» проектов, переключившись на конфигурацию COREONLY. Пока вы помните, что вы помните, чтобы построить Debug (все проекты), построен при редактировании кода, который не в каком-либо основных проектах, вы будете в порядке, и ваши строки Coreonly будут намного быстрее.

Сверху такого подхода состоит в том, что решение может быть очень медленным для открытия (хотя в Visual Studio 2008 , Visual Studio 2010 и Visual Studio 2012 Это намного лучше, чем в Visual Studio 2005 , поэтому у вас может быть не проблема с ним) и что если проект не включен в вашу конфигурацию, это никогда не будет перестраиваться , и поэтому ваша сборка (или запущенная приложение) может распадаться - вы должны не забывать переключиться на регулярное «строить все», если вы думаете, что вы приняли изменения в ( или влияние на) инвалидные проекты.

2
ответ дан 30 November 2019 в 07:23
поделиться

Другой подход, который вы можете рассмотреть, это просто выгрузить проекты, которые вы не используете, просто щелкните правой кнопкой мыши и выгрузите те, над которыми вы не работаете... это должно привести к гораздо более snapper Visual Studio. Это держит много вещей в памяти VS.

Что-то еще можно сделать, это изменить определение построения и удалить все немодифицированные проекты (в зависимости от того, как вы ссылаетесь... вы знаете, что нужно/обновлено/не нужно).

Решение - > Щелкните правой кнопкой мыши - > Configuration Manager - > снимите флажок Сборка для любых проектов, которые не изменяются и не требуются каждая сборка по какой-либо другой причине. Это ускоряет сборку, используя выходные данные последней сборки этих проектов, откуда они выгружают свои двоичные файлы.

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

Обновить
В духе маршрута производительности (например, ожидание до VS 2010 на самом деле) вы приняли меры, перечисленные в некоторых других вопросах переполнения стека: Очень медленное время компиляции на Visual Studio и Оптимизация Visual Studio ? Это может иметь большое значение, и может привести производительность к приемлемому уровню, пока мы ждем на VS 2010, чтобы отправить .
Еще несколько вещей, которые могут оказать хорошее влияние на производительность:

  • Я настоятельно рекомендую твердотельный накопитель , если это вариант. Когда мы заказывали новые машины на работе, вся команда разработчиков работала с твердотельными накопителями, разница поразительна. Когда вы имеете дело с большим решением, оно вращает диск вокруг переключения физической головки в тысячи мест просто для чтения файлов в... это место, где SSD выигрывают, искать время эффективно 0 мс.
  • В том же духе, свободное решение - хороший шашечный центр (только если вы на физическом, НЕ дефрагментируйте твердотельный накопитель ) имеет большое значение... если вы используете что-то, что держит визуальную студию в уме. Я рекомендую MyDefrag (бесплатное программное обеспечение), так как его собственный алгоритм дефрагментации сохраняет структуру каталогов в виду, так что по крайней мере физический диск не тратит столько времени на переключение вокруг паровых файлов, которые вам нужны в вашем решении, они все очень близко на диске.
  • С учетом вышеизложенного предложения твердотельных накопителей, имейте в виду, что существует огромное несоответствие в производительности твердотельных накопителей между дешевым и быстрым диском, проведите здесь небольшое исследование. Не беспокойтесь о вашей системе, с бесплатной утилитой , такой как gParted , вы можете очень легко переместить весь диск ОС, и ваш старый диск будет по-прежнему резервным... до тех пор, пока твердотельный накопитель может вместить данные с вашего компьютера C, вы хороши.
11
ответ дан 30 November 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: