Я настроил проект MSBuild, так что цель по умолчанию - это новая цель, названная так же, как "BuildWithExternalReference". Эта новая цель называет две другие цели; первая - это настраиваемая цель, называемая "BuildExternalReference", которая создает DLL с помощью внешнего инструмента. DLL, которая построена, является ссылкой для основного проекта, который построен с использованием обычной цели "Build". Я настраиваю атрибуты Inputs and Outputs для цели 'BuildExternalReference', поэтому входы ссылаются на исходные файлы, а выходы ссылаются на полученную DLL.
В Visual Studio 2012 и Visual Studio 2010 сборка работает правильно при первом вызове. Тем не менее, при последующих сборках, если я изменю внешние исходные файлы (на которые ссылается атрибут Attaching Inputs "BuildExternalReference" ), Visual Studio 2012 просто сообщает "Build: 0 успешно, 0 не удалось, 1 обновлен, 0 пропущен". Visual Studio 2010 продолжает работать отлично. Кроме того, создание из командной строки MSBuild.exe отлично работает.
Я знаю, что система сборки в Visual Studio 2012 изменилась, но я не могу найти информацию об изменениях в том, как выполняются инкрементные сборки.
Что-нибудь изменилось в Visual Studio 2012, чтобы вызвать изменение инкрементных построек?
Здесь вырезанная версия файла csproj, который я использую:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="BuildWithExternalTool" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ExternalSourceFiles Include="..\ExternalSourceFiles\\*\*.cs" />
<ExternalDll Include="..\ExternalSource\External.dll" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="BuildExternalTool" Inputs="@(ExternalSourceFiles);" Outputs="@(ExternalDll)">
<Exec Command="C:\External\Path\To\Tool.exe" />
</Target>
<Target Name="BuildWithExternalTool">
<CallTarget Targets="BuildExternalTool" />
<CallTarget Targets="Build" />
</Target>
</Project>
Обновление 1 ноября 2012
Вот полный самодостаточный пример, который воспроизводит проблему:
https://skydrive.live.com/redir?resid=EA1DD6ACA92F9EFF!155&authkey=!ANhuqF_rrCgxpLE
Это решение с одним проектом. Файл MSBuildIssueExample\MSBuildIssueExample.csproj был настроен так, что есть целевая цель по умолчанию. Эта целевая цель по умолчанию вызывает пользовательскую цель (называемую "ExternalTool" ), а затем целевую сборку по умолчанию.
Пользовательский целевой объект ExternalTool записывает некоторые сообщения, чтобы убедиться, что он работает, а также копирует содержимое файла MSBuildIssueExample\ExternalTool\Input.txt поверх файла MSBuildIssueExample\ExternalTool\Output.txt.
Файл Input.txt представляет собой вход для объекта ExternalTool, а Output.txt - выход.
Чтобы воссоздать проблему, выполните следующие действия:
1) Откройте решение в указанной версии Visual Studio
2) Постройте решение один раз, чтобы убедиться, что выходы обновлены относительно входов
3) Измените файл MSBuildIssueExample\ExternalTool\Input.txt, чтобы его содержимое не соответствовало Output.txt
4) Снова заново
Когда вы пройдете этот процесс в Visual Studio 2010, объект ExternalTool снова будет вызываться, а файл Input.txt будет скопирован через Output.txt.
Когда вы пройдете этот процесс в Visual Studio 2012, цель ExternalTool не будет вызываться, даже если входы новее, чем выходы, и в результате содержимое Input.txt не будет записано в Output.txt.
Однако, если вы перестраиваете (а не просто Build), то обе версии Visual Studio работают как ожидалось.