Как вы организуете проекты Visual Studio с открытым исходным кодом с зависимостями с открытым исходным кодом?

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

  1. Я могу добавить весь связанный код из другого проекта в мой репозиторий, но таким образом я не смогу внести свой вклад в развёртывание зависимого проекта. Я просто стану частью моего хранилища. Не очень хочу это делать.
  2. Я могу поддерживать другой проект полностью отдельно и копировать *.dll файлы в мой проект. И зафиксируйте зависимые dll-файлы в git. Это хорошо, но я теряю способность разрабатывать два проекта одновременно, а также входить в зависимый код при отладке (ну, может, нет, если копировать *.pdb файлы вместе)
  3. Как и в пункте 2, я могу создавать пакеты nuget из зависимого проекта и добавлять их в свой основной проект - опять же, я не могу по-настоящему разрабатывать оба проекта одновременно, нужно переключать контексты.
  4. С некоторой магией есть файл решения, который объединяет проекты из моего хранилища и из зависимого хранилища. При каждой сборке копируйте зависимые dll-файлы в папку /lib и фиксируйте их. Таким образом, мне не нужно переключать контексты между отдельными проектами. Но недостаток заключается в том, что когда другие участники git тянут мой проект, они не получают зависимый проект, и файлы решения, вероятно, будут повреждены для них, потому что он будет ссылаться на проект, которого нет в репо.

Как вы организуете свой код в этом случае?

3 ответа

Решение

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

Для получения дополнительной информации об источнике символов и nuget см. Также: Создание и публикация пакета символов. Чтобы включить отладку источника символов, см. http://www.symbolsource.org/Public/Home/VisualStudio.

Вы также должны не забыть включить восстановление пакета Nuget.

С этим решением вы не можете изменять исходный код, но, по крайней мере, вы можете отлаживать его.

Я использую что-то похожее по концепции на CMake, но целиком в Visual Studio. Существует относительно неизвестная особенность файлов свойств, которые могут быть включены решениями. Это позволяет создавать файл, содержащий только пути к зависимостям, включать библиотеки, которые вы можете, и устанавливать относительные пути, а затем требовать, чтобы люди устанавливали соответствующие пути для других зависимостей, которые вы не можете / не хотите включать.

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

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

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

В случае, если вы не создаете циклические зависимости, вот идея:

  1. добавить новый Class Library проект с уникальным именем, скажем ClassLibrary1, к решению

  2. в Build страница настроек своего проекта, конфиг Output path к пути вывода приложения

  3. в Build Events страницы, добавьте следующую строку в Post-build event command line блок:

    del "$(TargetPath)"
    
  4. повторите шаги с 1 по 3, но дайте другое имя, скажем ClassLibrary2 и конфиг Output path к исходному пути ClassLibrary1

  5. задавать Project Dependancies из ClassLibrary1, проверить ClassLibrary2

  6. добавить все другие проекты в качестве ссылки на проект ClassLibrary2, Покидать Copy Local со значением по умолчанию true

  7. строить ClassLibrary2 один раз, и все библиотеки DLL теперь находятся в исходном пути ClassLibrary1

  8. добавить их к ссылкам ClassLibrary1 и уходи Copy Local со значением по умолчанию true

  9. задавать Project Dependancies приложения и всех других проектов, не вызывающих циклических зависимостей, проверьте на ClassLibrary1

  10. добавить ссылки на другие проекты, из пути, в который были помещены библиотеки DLL ClassLibrary1

  11. задавать Copy Local из всех этих добавленных DLL в других проектах false

Итак, проект ClassLibrary1 быть центральным контролем внешних библиотек вашего решения. Каждый раз, когда вы Rebuild Solution (или просто создайте приложение), ClassLibrary1 копирует последние библиотеки DLL, добавленные к ссылкам в выходную папку приложения, и удаляет созданную библиотеку DLL с именем ClassLibrary1.DLL, Приложение и зависимости во время компиляции или во время выполнения будут использовать одну и ту же версию DLL, вам не нужно делать дополнительное развертывание или проверять каждое развертывание.

Другие вопросы по тегам