Как гарантировать, что проект имеет все ссылки из проектов, на которые он ссылается?
Рассмотрим решение со многими проектами библиотек классов. В каждом из них установлено несколько пакетов NuGet, и для каждого из этих проектов существует отдельный проект модульных тестов. Помня, что ссылки на проекты библиотек классов настроены на Copy Local = false
Как я могу убедиться, что в модульном тестовом проекте всегда есть хотя бы все ссылки из исходного проекта?
Мы были укушены этой проблемой уже несколько раз. Из-за отсутствия нашей ночной сборки происходит сбой из-за отсутствия DLL, и когда мы проверяем, что произошло, обычно кто-то добавляет новый пакет или ссылку на проект, но не устанавливает ту же ссылку в проекте модульных тестов. Эта проблема обычно не проявляется, потому что на компьютере разработчика каждый проект копирует свои выводы в отдельную папку. Однако при сборке в TFS MSBuild переопределяется, и все выходные данные помещаются в одну папку.
Мы используем Copy Local = false
Стратегия для всего, что не требует непосредственного выполнения (то есть только тестовые проекты и веб-приложения настроены на локальное копирование всех ссылок). Это было сделано, чтобы избежать ненужных копий dll и ускорить процесс сборки. Используя Copy Local = false
нам необходимо явно добавить все ссылки на каждый проект, потому что они не копируются из ссылочных проектов автоматически. Для проектов модульных тестов это обычно означает, что наши packages.config
Файл в тестовом проекте содержит все пакеты из исходного проекта, а также специальные тестовые библиотеки, такие как фальшивые фреймворки и тому подобное.
Лично мне нравится указывать все ссылки в явном виде, потому что кому-то легче видеть, что происходит, и что зависит от того, что более четко. У нас были проблемы в прошлом с дефолтом Copy Local = true
тоже, так что я не очень люблю возвращаться к этому. Но время от времени мы сталкиваемся с проблемой, которая связана с тем, что кто-то не добавляет необходимые ссылки.
Могу ли я каким-то образом применить это, чтобы не было возможности иметь не все ссылки из зависимого проекта в данном проекте? В идеале, я бы хотел, чтобы это была ошибка компиляции, но было бы полезно любое принудительное исполнение. Было бы очень здорово, если бы каждый проект в решении вел себя как пакет NuGet при обращении друг к другу: с пакетами NuGet вы всегда уверены, что все ссылки верны, потому что зависимости явно указаны в nupkg и добавлены в любой проект, который добавляет оригинальная упаковка.