Сборка в GAC не копируется для вывода в проект, который ссылается на проект, который ссылается на сборку GAC с CopyLocal=true
У меня есть "Проект A", который ссылается на System.Web.Mvc с CopyLocal=TRue. System.Web.Mvc находится в GAC как на моей локальной машине, так и на сервере сборки.
У меня также есть "Проект B", который ссылается на "Проект A" в выходных данных для "Проекта B" System.Web.Mvc не копируется во время сборки.
Я подозреваю, что это потому, что это в GAC. Это правда? И можно ли что-то сделать, чтобы MSBuild скопировал его в выходную папку?
Я прочитал ответ от Muse VsExtensions в этой теме, в котором говорится только о прямой ссылке на GAC, однако у нас есть косвенная ссылка через "Проект A": .NET Reference "Копировать локальный" True / False Быть установленным на основе содержимого GAC
Этот пост также имеет отношение к теме: http://deeperdesign.wordpress.com/2010/02/08/msbuild-assembly-dependencies-and-the-gac/
3 ответа
Одно из предложений, которое я видел в этом, заключается в том, чтобы все ваши проекты имели одинаковый путь вывода. Это имеет ограниченную ценность, поскольку, если у вас есть цепочка зависимостей, такая как: Prj B > Prj A > Lib C, то это, вероятно, потому, что Prj A совместно используется несколькими приложениями, для которых вы захотите, чтобы у каждого был свой собственный выходной путь.
Я решил проблему, вместо этого используя MSBuild для компиляции и установив свойство OutDir для каждой сборки.
например MSBuild projectB.csproj /p:OutDir=C:\AppBOutput\
Это поместит выходные данные для проекта B, его зависимых проектов (prj A) и prj As и скопирует все локальные зависимости в каталог C:\AppBOutput\.
Почему это работает
При сборке проекта в Visual Studio оба prj A и prj B имеют свой собственный выходной каталог, например prjA\bin\debug
а также prjB\bin\debug
, Сохраненная в GAC сборка, установленная на copylocal, будет включена в выходной каталог проекта, который непосредственно ссылается на него (prjA). Но он не будет скопирован в выходной каталог проекта, ссылающегося на этот проект (prjB). Именно так работает копирование ссылок проекта. Покопайтесь в целях MSBuild, и я уверен, что основная причина может быть найдена (извините, не делаю это сам).
Что за /p:OutDir=C:\AppBOutput\
Параметр MSBuild делает, устанавливает каталог вывода всех проектов, чтобы быть одинаковым. Делая это, вы обходите MSBuild так, как он копирует эталонные выходные данные проекта. Вместо того, чтобы полагаться на MSBuild, чтобы скопировать часть содержимого в prjA\bin\debug
в prjB\bin\debug
, вы просто принудительно выводите все проекты в один и тот же каталог.
Вы проверяли файл.csproj, чтобы убедиться, что ссылка действительно содержит <Private>True</Private>
тег? Копия локальная, к сожалению, имеет 3 состояния в XML - True, False и... отсутствует.
Прагматичное (читай взломать) решение заключается в том, что я ссылался на System.Web.Mvc.dll в "Проекте B". Это определенно не правильное решение, поэтому, пожалуйста, принесите мне лучшее решение:-)