Как вы организуете проекты Visual Studio с открытым исходным кодом с зависимостями с открытым исходным кодом?
Я запустил проект MVC4 с открытым исходным кодом, который использует другой проект с открытым исходным кодом в качестве зависимости. Я разработал другой проект и буду модифицировать его в соответствии с моими потребностями. Проблема, с которой я сталкиваюсь, заключается в том, чтобы эти проекты зависели друг от друга, но поддерживались отдельно. Тем не менее, люди, которые хотят потянуть мой проект, также получат проект зависимости?
- Я могу добавить весь связанный код из другого проекта в мой репозиторий, но таким образом я не смогу внести свой вклад в развёртывание зависимого проекта. Я просто стану частью моего хранилища. Не очень хочу это делать.
- Я могу поддерживать другой проект полностью отдельно и копировать *.dll файлы в мой проект. И зафиксируйте зависимые dll-файлы в git. Это хорошо, но я теряю способность разрабатывать два проекта одновременно, а также входить в зависимый код при отладке (ну, может, нет, если копировать *.pdb файлы вместе)
- Как и в пункте 2, я могу создавать пакеты nuget из зависимого проекта и добавлять их в свой основной проект - опять же, я не могу по-настоящему разрабатывать оба проекта одновременно, нужно переключать контексты.
- С некоторой магией есть файл решения, который объединяет проекты из моего хранилища и из зависимого хранилища. При каждой сборке копируйте зависимые dll-файлы в папку /lib и фиксируйте их. Таким образом, мне не нужно переключать контексты между отдельными проектами. Но недостаток заключается в том, что когда другие участники git тянут мой проект, они не получают зависимый проект, и файлы решения, вероятно, будут повреждены для них, потому что он будет ссылаться на проект, которого нет в репо.
Как вы организуете свой код в этом случае?
3 ответа
Обычно я использую nuget для всех моих зависимостей. Когда я разветвляю проект, я разверну его на nuget, а также на источнике символов. Таким образом, вы можете без проблем войти в источник зависимости.
Для получения дополнительной информации об источнике символов и nuget см. Также: Создание и публикация пакета символов. Чтобы включить отладку источника символов, см. http://www.symbolsource.org/Public/Home/VisualStudio.
Вы также должны не забыть включить восстановление пакета Nuget.
С этим решением вы не можете изменять исходный код, но, по крайней мере, вы можете отлаживать его.
Я использую что-то похожее по концепции на CMake, но целиком в Visual Studio. Существует относительно неизвестная особенность файлов свойств, которые могут быть включены решениями. Это позволяет создавать файл, содержащий только пути к зависимостям, включать библиотеки, которые вы можете, и устанавливать относительные пути, а затем требовать, чтобы люди устанавливали соответствующие пути для других зависимостей, которые вы не можете / не хотите включать.
Немного потрудившись, он получается довольно чистым, и его очень легко автоматизировать с помощью TeamCity и других подобных инструментов (каждый агент сборки может устанавливать переменные, чтобы указать, где он хранит зависимости).
Для небольших зависимостей и тех, которые были настроены для работы с моим проектом, я сохраняю архив или свободные файлы в хранилище и использую файл свойств для ссылки на них. У других есть инструкции о том, где их найти и как редактировать пути.
Если вы заинтересованы в таком подходе, я могу вдаваться в некоторые подробности. Потребовалось немного усилий, чтобы выяснить это, поскольку файлы свойств не очень хорошо документированы, но работают довольно аккуратно.
В случае, если вы не создаете циклические зависимости, вот идея:
добавить новый
Class Library
проект с уникальным именем, скажемClassLibrary1
, к решениюв
Build
страница настроек своего проекта, конфигOutput path
к пути вывода приложенияв
Build Events
страницы, добавьте следующую строку вPost-build event command line
блок:del "$(TargetPath)"
повторите шаги с 1 по 3, но дайте другое имя, скажем
ClassLibrary2
и конфигOutput path
к исходному путиClassLibrary1
задавать
Project Dependancies
изClassLibrary1
, проверитьClassLibrary2
добавить все другие проекты в качестве ссылки на проект
ClassLibrary2
, ПокидатьCopy Local
со значением по умолчаниюtrue
строить
ClassLibrary2
один раз, и все библиотеки DLL теперь находятся в исходном путиClassLibrary1
добавить их к ссылкам
ClassLibrary1
и уходиCopy Local
со значением по умолчаниюtrue
задавать
Project Dependancies
приложения и всех других проектов, не вызывающих циклических зависимостей, проверьте наClassLibrary1
добавить ссылки на другие проекты, из пути, в который были помещены библиотеки DLL
ClassLibrary1
задавать
Copy Local
из всех этих добавленных DLL в других проектахfalse
Итак, проект ClassLibrary1
быть центральным контролем внешних библиотек вашего решения. Каждый раз, когда вы Rebuild Solution
(или просто создайте приложение), ClassLibrary1
копирует последние библиотеки DLL, добавленные к ссылкам в выходную папку приложения, и удаляет созданную библиотеку DLL с именем ClassLibrary1.DLL
, Приложение и зависимости во время компиляции или во время выполнения будут использовать одну и ту же версию DLL, вам не нужно делать дополнительное развертывание или проверять каждое развертывание.