Я использую subversion и nant (и visual studio IDE)
Я следил за предлагаемой структурой проекта http://blog.jpboodhoo.com/NAntStarterSeries.aspx, которая защищает автономные каталоги подрывной деятельности, где разработчик может делать чек и немедленно создайте проект за один шаг.
Моя структура репо выглядит следующим образом:
/Repo
/MainProject
/trunk
/doc <-- documentation
/lib <-- binary-only DLLs
/src <-- source code for MainProject
/tools <-- holds tools like nant, nunit, etc
...
/ClassLibrary1
/trunk
/doc
/lib
/src
/tools
...
/ClassLibrary2
/trunk
/doc
/lib
/src
/tools
Непонятно, как структурировать проект, в котором есть библиотеки классов, которые, в свою очередь, ссылаются на сторонние библиотеки DLL.
В настоящее время у меня есть основной проект с рабочим каталогом, например
Пример:
/MainProject
/build
/lib
/src
/MainProject
/ClassLibrary1 <-- svn external to svn://server/repo/ClassLibrary1/trunk/src
/ClassLibrary2 <-- svn external to svn://server/repo/ClassLibrary2/trunk/src
/tools
...
При создании MainProject я компилирую библиотеки классов и вывод DLL в папку сборки. Тем не менее, сами библиотеки классов имеют стороннюю двоичную библиотеку DLL, которую они ссылаются.
Мои вопросы в том, чтобы построить MainProject, я должен каким-то образом получить стороннюю DLL из библиотек классов в вывод сборки. Как это сделать?
Мысли: 1. Должен ли я хранить копии этих сторонних библиотек DLL в папке MainProject lib? 2. Или должна ли моя svn: внешняя ссылка быть в trunk проекта библиотеки классов, а не в src, чтобы я мог получить доступ к папке lib библиотеки классов? 3. Должен ли я использовать функцию subversion 1.6 svn: externals для отдельных файлов?
Лично я ввожу в багажник библиотек, на которые вы ссылаетесь. (На самом деле, я ввожу корень тега, но это рядом с точкой).
Если вы сохраняете отдельную копию требуемой DLL, то вы не позволяете библиотеке, на которую ссылается, определять, что ей нужно для себя, потому что вся эта логика дублируется в проекте. То же самое происходит, если вы используете несколько внешних ссылок или внешних файлов для ввода кода и DLL.
Мой принцип заключается в том, что библиотека знает, что ей нужно, одна внешняя ссылка на библиотеку может получить эту библиотеку и все, что ей нужно.
Таким образом, если вы измените ссылки на библиотеку, вы можете быть уверены, что все и все проекты просто подберут это. (если среда IDE не поддерживает это, проблема с IDE, а не субверсия). Вы также можете быть уверены в проекте, что если вы измените версию библиотеки, на которую вы указываете, вы также автоматически получите правильные ссылки, и вам не нужно будет отлаживать ошибки сборки, чтобы решить, что пошло не так.
Должен ли я хранить копии этих сторонних библиотек DLL в папке MainProject lib? Я предпочитаю хранить любые внешние библиотеки в каталоге двоичных файлов под соединительной линии, но рядом с исходным кодом... или звонить это ссылки, зависимости и т.д. Затем это позволяет любому разработчику получить последние, и все, что потребуется, спустится. Это не обязательно должно быть частью проекта как такового. Он просто должен быть доступен, когда выполняется сборка.
Или должна ли моя svn: внешняя ссылка быть в trunk проекта библиотеки классов, а не в src, чтобы я мог получить доступ к папке lib библиотеки классов? Я не предпочитаю этого поскольку он делает процесс получения нового разработчика более запутанным. Я думаю, что сборка может войти в свой собственный репозиторий, когда он имеет уровень важности для себя. Но я никогда не буду ссылаться на его результаты. Он должен иметь процесс сборки, обернутый вокруг него, который продвигает механизм "развертывания" вывода в вышеупомянутый каталог ссылок или зависимостей. Однако автоматизация такого развертывания может быть сопряжена с проблемами. Было бы лучше, если бы на собрании был свой собственный процесс. И когда была выпущена новая версия сборки, она была бы объявлена разработчиком в проекте, который в ней нуждался. Затем они могут проверить это, принять его и поместить в свой процесс сборки. Очевидно, что если эта сборка меняется ежедневно, может потребоваться автоматизация.
Должен ли я использовать функцию subversion 1.6 для svn: externals для отдельных файлов? Нет. Я предпочитаю сохранить проект/решение как автономную сущность. Распространение школьных материалов на все места делает зависимости более болезненными. Держите силосы как можно труднее... привносите новые вещи в максимально возможной степени... или как руководство, так как частота, с которой могут измениться вещи, позволит.
У меня была аналогичная потребность, и я нашел короткий и сладкий ответ в документации TortoiseSVN:
http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-howto-common-projects.html