VS2012 проект containg Поддельные сборки всегда восстанавливаются
Первоначально мы нашли эту проблему в сложном решении, но теперь я могу воспроизвести ее и в фиктивном проекте.
Если я создаю проект в версии VS2012 premium (обновление 4) и добавлю сборку подделок для одной из ссылок, кажется, что проект всегда будет перестраиваться независимо от того, что будет изменено. То есть Я создаю проект, а затем снова нажимаю кнопку сборки, что приведет к восстановлению проекта.
Включение информации о диагностической сборке кажется, что основной причиной проблемы является то, что инструмент, компилирующий файл .fakes, касается файла .Fakes.dll, поэтому VS думает, что что-то изменилось:
1>Using "Touch" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
1>Task "Touch" (TaskId:11)
1> Task Parameter:
1> Files=
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.dll
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.fakesconfig
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.fakesconfig (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.dll". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.fakesconfig". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.fakesconfig". (TaskId:11)
1>Done executing task "Touch". (TaskId:11)
[...]
1>Input file "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll" is newer than output file "obj\Debug\UnitTestProject1.pdb".
Пожалуйста, сообщите, что я делаю неправильно и как обойти это, чтобы проект не перестраивался избыточно все время.
Заранее спасибо
Edited
Для пояснения здесь приведены шаги по воспроизведению проблемы:
- Создайте проект С# по вашему выбору (я пробовал unit test и консольное приложение)
- Добавьте сборку подделок на одну из ссылочных сборок (я использовал систему в приведенном выше примере)
- Постройте проект
- Создайте его снова (не перестраивайте)
Обратите внимание, что вам не нужно добавлять в решение одну строку кода.
Ответы
Ответ 1
Попробуйте изменить настройки реестра visual studio. Установите "U2DCheckVerbosity"=dword:00000001
в [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\General]
Затем вы увидите на выходе, почему визуальная студия думает, необходима полная перестройка.
Исходная информация здесь.
Ответ 2
У меня возникла одна и та же проблема из-за некоторых ссылок на внешние файлы: когда свойство CopyToOutputDirectory
было установлено на Always
, значительное количество проектов перестраивалось снова и снова, даже если никаких изменений в кода.
В VS2013 Update 2 я не могу воспроизвести проблему, просто добавив Fake Assembly, но я могу воспроизвести ее, если CopyToOutputDirectory
для Fake Assembly установлено либо Always
, либо PreserveNewest
(т.е. Скопировать, если новый в VS GUI).
В вашем случае я бы дважды проверил с помощью текстового редактора, если .csproj содержит любой тег, например:
<Fakes Include="Fakes\mscorlib.fakes">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Fakes>
то есть CopyToOutputDirectory
либо установить на Always
, либо PreserveNewest
, модифицируя их в
<Fakes Include="Fakes\mscorlib.fakes" />
Ответ 3
Я также столкнулся с этой же проблемой. Я зашел так далеко, чтобы дважды проверить входы/выходы на задачу BuildFakesAssemblies в Microsoft.QualityTools.Testing.Fakes.targets, распечатав файл и его метку времени, но не смог увидеть какие-либо входы с более новой меткой времени, чтобы любой из временные метки для выходных файлов (хотя я не проверял размер файла, который, по моему мнению, является еще одним определяющим фактором в том, следует ли исполнять цель msbuild). Это задача BuildFakesAssemblies, которая затем касается файлов .fakes.dll, на которые ссылаются в тестовом проекте, что вызывает ненужную перекомпиляцию, когда ничего не изменилось.
Во время поиска файлов .targets я заметил, что версия файла Microsoft.QualityTools.Testing.Fakes.targets версии 2013 года не содержит в ней команды Touch. Итак, я изменил файл .sln, содержащий тестовый проект (Format version 12 → 13, VS 2012 → 2013), а затем перезапустил мою сборку в командной строке, и проблема больше не происходит! Надеюсь, это поможет следующему человеку!