Сборка в GAC не копируется для вывода в проект, который ссылается на проект, который ссылается на сборку GAC с CopyLocal = true

У меня есть "Проект А", который ссылается на System.Web.Mvc с CopyLocal = TRue. System.Web.Mvc находится в GAC как на моей локальной обработке, так и на сервере buildserver.

У меня также есть "Project B", который ссылается на "Project A" в выводе для "Project B" System.Web.Mvc не копируется во время сборки.

Я подозреваю, что это происходит потому, что он находится в GAC. Это правда? И могу ли я сделать что-то, чтобы заставить MSBuild скопировать его в выходную папку?

Я прочитал ответ от Muse VsExtensions в этом потоке, который говорит только о прямой ссылке на GAC, однако мы косвенно ссылаемся на "Проект А": Ссылка на .NET и "Копировать локальные" Значение True/False установлено на основе содержимого GAC

Этот blogpost также связан: http://deeperdesign.wordpress.com/2010/02/08/msbuild-assembly-dependencies-and-the-gac/

Ответы

Ответ 1

Одно из предложений, которое я видел в этом случае, заключается в том, чтобы изменить все ваши проекты на один и тот же путь вывода. Это имеет ограниченное значение, поскольку, если у вас есть цепочка зависимостей, например: Prj B > Prj A > Lib C Тогда, вероятно, из-за того, что Prj A разделяется между несколькими приложениями, для которых вы захотите, чтобы каждый из них имел свой собственный путь вывода.

Я решил проблему, вместо этого используя MSBuild для компиляции и установки свойства OutDir для каждой сборки.

например. MSBuild projectB.csproj /p:OutDir=C:\AppBOutput\

Это приведет к выходу для проекта B, его зависимых проектов (prj A) и prj. Скопируйте локальные зависимости all в каталог C:\AppBOutput \.

Почему он работает

При создании проекта в Visual Studio оба prj A и prj B имеют свой собственный выходной каталог, например. prjA\bin\debug и prjB\bin\debug. Сборник GAC, установленный на copylocal, будет включен в выходной каталог проекта, который непосредственно ссылается на него (prjA). Но он будет не скопирован в выходной каталог проекта, ссылающегося на этот проект (prjB). Это то, как работает копирование ссылок проекта. Копайте в целевые объекты MSBuild, и я уверен, что основная причина может быть найдена (извините, но не делайте это самостоятельно).

Что делает параметр /p:OutDir=C:\AppBOutput\ MSBuild, устанавливается, что выходной каталог проектов all одинаковый. Поступая таким образом, вы пошаговываете поведение MSBuild того, как он копирует ссылки на проект-проект. Вместо того, чтобы полагаться на MSBuild для копирования некоторого содержимого в prjA\bin\debug в prjB\bin\debug, вы просто вынуждаете все проекты выводить в тот же каталог.

Ответ 2

Вы проверили файл .csproj, чтобы убедиться, что ссылка действительно содержит тег <Private>True</Private>? К сожалению, у копии локально есть 3 состояния в xml - True, False и... missing.

Ответ 3

Прагматическое решение (read hack) заключается в том, что я ссылался на System.Web.Mvc.dll в "Project B". Это, безусловно, не правильное решение, поэтому, пожалуйста, принесите мне лучшее решение: -)