Подтвердить что ты не робот

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 и консольное приложение)
  • Добавьте сборку подделок на одну из ссылочных сборок (я использовал систему в приведенном выше примере)
  • Постройте проект
  • Создайте его снова (не перестраивайте)

Обратите внимание, что вам не нужно добавлять в решение одну строку кода.

4b9b3361

Ответ 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), а затем перезапустил мою сборку в командной строке, и проблема больше не происходит! Надеюсь, это поможет следующему человеку!